39934


以下の構造になってるテーブル郡があり、全てのテーブルにデータが幾つか入っているとします。

[code]

    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)
    );
    
[/code]

その後、テーブルCに対して

  1. a_idを削除したい(DROP FOREIGN KEY, DROP COLUMN)
  2. b_idという外部キーを追加したい。

という要件があり、以下のようなSQLを書きました。

[code]

    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;
    
[/code]

ですが、`ADD COLUMN`の`DEFAULT @B_ID`がシンタックスエラーになります。

このように`ALTER TABLE`で外部キーを追加しつつ、`NOT NULL`にしたいようなケースでは  
どのようなSQLを書くべきでしょうか。

ご教示いただければ幸いでございます。  
どうぞよろしくお願い致します。


CC BY-SA 3.0
2017-11-29T08:48:29.307
39931
2017-11-29T11:34:58.653
5836
question
mysql sql
MySQLにおいてDEFAULT値にユーザ定義変数を指定することは可能でしょうか？


1ステートメントで実現するのは難しいのではないでしょうか

  * ADD COLUMN
  * UPDATE
  * ADD CONSTRAINT

の3つのステートメントに分割するのが無難だと思います

ただ、mysqlはDDLにtransactionがかからないので、オンラインで作業を実施するときは問題になるかもしれません


CC BY-SA 3.0
2017-11-29T11:34:58.653
39934
2017-11-29T11:34:58.653
9796
39931
answer