Saya tidak tahu cara apa pun untuk melakukan ini dalam satu pernyataan, bahkan menggunakan pemicu.
Solusi pemicu yang disarankan @Lucky akan terlihat seperti ini di MySQL:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Namun, ada masalah. Di bagian BEFORE INSERT
fase, id
. yang dibuat secara otomatis nilai belum dihasilkan. Jadi jika group_id
adalah null, defaultnya adalah NEW.id
yang selalu 0.
Tetapi jika Anda mengubah pemicu ini menjadi aktif selama AFTER INSERT
fase, sehingga Anda memiliki akses ke nilai yang dihasilkan dari NEW.id
, Anda tidak dapat mengubah nilai kolom.
MySQL tidak mendukung ekspresi untuk DEFAULT
kolom, jadi Anda juga tidak bisa mendeklarasikan perilaku ini dalam definisi tabel. *Pembaruan:MySQL 8.0.13 mendukung DEFAULT (<expression>)
tetapi ekspresi masih tidak dapat bergantung pada nilai kenaikan otomatis (ini adalah didokumentasikan
).
Satu-satunya solusi adalah melakukan INSERT
, lalu segera lakukan UPDATE
untuk mengubah group_id
jika tidak disetel.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();