トリガーを使用しても、1つのステートメントでこれを行う方法がわかりません。
@Luckyが提案したトリガーソリューションは、MySQLでは次のようになります。
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
ただし、問題があります。 BEFORE INSERT
フェーズ、自動生成されたid
値はまだ生成されていません。したがって、group_id
nullの場合、デフォルトはNEW.id
です。 これは常に0です。
ただし、AFTER INSERT
中にこのトリガーを起動するように変更すると、 フェーズなので、生成されたNEW.id
の値にアクセスできます。 、列の値を変更することはできません。
MySQLはDEFAULT
の式をサポートしていません したがって、テーブル定義でもこの動作を宣言することはできません。 *更新:MySQL8.0.13はDEFAULT (<expression>)
をサポートします ただし、式は自動インクリメント値に依存できません(これは文書化
)。
唯一の解決策は、INSERT
を実行することです 、そしてすぐにUPDATE
を実行します group_id
を変更するには 設定されていない場合。
INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();