Tôi thấy hai giải pháp khả thi cho việc này:
1. Khả năng:
Bạn chỉ cần sử dụng một hàm để bỏ qua sort_num
nếu nó không được đặt:
`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)`
coalesce()
trả về giá trị không rỗng đầu tiên, do đó bạn sẽ chèn các giá trị cho sort_num
nếu bạn thực sự cần sắp xếp lại các mặt hàng.
2. Khả năng:
Bạn viết một trình kích hoạt, tự động đặt giá trị nếu nó không được đặt trong câu lệnh chèn:
DELIMITER //
CREATE TRIGGER sort_num_trigger
BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
DECLARE auto_inc INT;
IF (NEW.sort_num is null) THEN
-- determine next auto_increment value
SELECT AUTO_INCREMENT INTO auto_inc FROM information_schema.TABLES
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = 'mytable';
-- and set the sort value to the same as the PK
SET NEW.sort_num = auto_inc;
END IF;
END
//
(lấy cảm hứng từ nhận xét này )
Tuy nhiên, điều này có thể gặp phải sự cố song song (chèn nhiều truy vấn cùng một lúc)