Nie znam żadnego sposobu, aby to zrobić w jednym stwierdzeniu, nawet przy użyciu wyzwalacza.
Rozwiązanie wyzwalacza, które sugerował @Lucky, wyglądałoby w MySQL tak:
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Jest jednak problem. W BEFORE INSERT
faza, automatycznie wygenerowany id
wartość nie została jeszcze wygenerowana. Więc jeśli group_id
ma wartość null, domyślnie NEW.id
co zawsze wynosi 0.
Ale jeśli zmienisz ten wyzwalacz na uruchamianie podczas AFTER INSERT
faza, dzięki czemu masz dostęp do wygenerowanej wartości NEW.id
, nie można modyfikować wartości kolumn.
MySQL nie obsługuje wyrażeń dla DEFAULT
kolumny, więc nie można również zadeklarować tego zachowania w definicji tabeli. *Aktualizacja:MySQL 8.0.13 obsługuje DEFAULT (<expression>)
ale wyrażenie nadal nie może zależeć od wartości automatycznego przyrostu (jest to udokumentowane
).
Jedynym rozwiązaniem jest wykonanie INSERT
, a następnie natychmiast wykonaj UPDATE
aby zmienić group_id
jeśli nie jest ustawiony.
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();