質問: 以下の構造になってるテーブル郡があり、全てのテーブルにデータが幾つか入っているとします。 ``` CREATE TABLE A ( id BIGINT(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY(id) ); CREATE TABLE B ( id BIGINT(20) NOT NULL AUTO_INCREMENT, a_id BIGINT(20) NOT NULL, PRIMARY KEY(id), FOREIGN KEY(a_id) REFERENCES A(id) ); CREATE TABLE C ( id BIGINT(20) NOT NULL AUTO_INCREMENT, a_id BIGINT(20) NOT NULL, PRIMARY KEY(id), FOREIGN KEY(a_id) REFERENCES A(id) ); ``` その後、テーブルCに対して 1. a_idを削除したい(DROP FOREIGN KEY, DROP COLUMN) 2. b_idという外部キーを追加したい。 という要件があり、以下のようなSQLを書きました。 ``` INSERT INTO A VALUES(); SELECT @A_ID:=last_insert_id(); INSERT INTO B (b_id) VALUES(@A_ID); SELECT @B_ID:=last_insert_id(); ALTER TABLE C ADD COLUMN b_id BIGINT(20) NOT NULL DEFAULT @B_ID, ADD CONSTRAINT FOREIGN KEY (b_id) REFERENCES B(id); ALTER TABLE C DROP FOREIGN KEY `c_ibfk_1`; ALTER TABLE C DROP COLUMN a_id; ``` ですが、`ADD COLUMN`の`DEFAULT @B_ID`がシンタックスエラーになります。 このように`ALTER TABLE`で外部キーを追加しつつ、`NOT NULL`にしたいようなケースでは どのようなSQLを書くべきでしょうか。 ご教示いただければ幸いでございます。 どうぞよろしくお願い致します。
回答: 1ステートメントで実現するのは難しいのではないでしょうか * ADD COLUMN * UPDATE * ADD CONSTRAINT の3つのステートメントに分割するのが無難だと思います ただ、mysqlはDDLにtransactionがかからないので、オンラインで作業を実施するときは問題になるかもしれません