Tôi không biết có cách nào để thực hiện điều này trong một câu lệnh, ngay cả khi sử dụng trình kích hoạt.
Giải pháp kích hoạt mà @Lucky đề xuất sẽ giống như thế này trong MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Tuy nhiên, có một vấn đề. Trong BEFORE INSERT
pha, id
được tạo tự động giá trị chưa được tạo. Vì vậy, nếu group_id
là null, nó được mặc định là NEW.id
luôn là 0.
Nhưng nếu bạn thay đổi trình kích hoạt này để kích hoạt trong AFTER INSERT
để bạn có quyền truy cập vào giá trị được tạo của NEW.id
, bạn không thể sửa đổi giá trị cột.
MySQL không hỗ trợ các biểu thức cho DEFAULT
của một cột, vì vậy bạn cũng không thể khai báo hành vi này trong định nghĩa bảng. * Cập nhật:MySQL 8.0.13 hỗ trợ DEFAULT (<expression>)
nhưng biểu thức vẫn không thể phụ thuộc vào giá trị tăng tự động (đây là được lập thành tài liệu
).
Giải pháp duy nhất là thực hiện INSERT
, và sau đó thực hiện ngay lập tức UPDATE
để thay đổi group_id
nếu nó không được đặt.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();