トリガーを使用しても、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();