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();