Ich kenne keine Möglichkeit, dies in einer Anweisung zu tun, nicht einmal mit einem Trigger.
Die von @Lucky vorgeschlagene Triggerlösung würde in MySQL so aussehen:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Es gibt jedoch ein Problem. Im BEFORE INSERT
Phase, die automatisch generierte id
Wert wurde noch nicht generiert. Wenn also group_id
null ist, wird standardmäßig NEW.id
verwendet was immer 0 ist.
Aber wenn Sie diesen Trigger so ändern, dass er während AFTER INSERT
ausgelöst wird Phase, sodass Sie Zugriff auf den generierten Wert von NEW.id
haben , Sie können keine Spaltenwerte ändern.
MySQL unterstützt keine Ausdrücke für DEFAULT
einer Spalte, daher können Sie dieses Verhalten auch nicht in der Tabellendefinition deklarieren. *Aktualisierung:MySQL 8.0.13 unterstützt DEFAULT (<expression>)
aber der Ausdruck kann immer noch nicht von einem Auto-Increment-Wert abhängen (dies ist dokumentiert
).
Die einzige Lösung besteht darin, INSERT
auszuführen , und führen Sie dann sofort ein UPDATE
durch um die group_id
zu ändern wenn es nicht gesetzt ist.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();