1. ホーム
  2. mysql

[解決済み] 外部キー制約で使用されるカラムを変更できない

2022-06-06 04:17:16

質問

テーブルを変更しようとすると、このエラーが発生しました。

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'

以下は私のCREATE TABLE STATEMENTで、正常に実行されました。

CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

そして、この文を実行しようとしたところ、上記のエラーが発生しました。

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

どのように解決するのですか?

外部キーのフィールドと参照の型と定義が同じである必要があります。 これは、外部キーがフィールドの型を変更することを許可していないことを意味します。

一つの解決策はこれでしょう。

LOCK TABLES 
    favorite_food WRITE,
    person WRITE;

ALTER TABLE favorite_food
    DROP FOREIGN KEY fk_fav_food_person_id,
    MODIFY person_id SMALLINT UNSIGNED;

これで、person_idを変更することができます。

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

外部キーの再作成

ALTER TABLE favorite_food
    ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
          REFERENCES person (person_id);

UNLOCK TABLES;

EDITです。 上記のロックを追加、コメントに感謝

<ブロッククオート

この操作を行うときは、データベースへの書き込みを禁止する必要があります。 さもなければ、データ整合性の問題が発生する危険性があります。

上に書き込みロックを追加しました

自分以外のセッションでクエリを書くと、すべて ( INSERT, UPDATE, DELETE ) はタイムアウトまで待つか UNLOCK TABLES が実行されるまで待ちます。

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

EDIT 2: OPは、"外部キーフィールドと参照の型と定義が等しくなければならないという行について、より詳細な説明を求めました。これは、外部キーがフィールドの型を変更することを許可しないことを意味します。

から MySQL 5.5 リファレンスマニュアル。FOREIGN KEY 制約

外部キーと参照されるキーの対応するカラムは、InnoDB内部で類似した内部データ型を持つ必要があります。 InnoDB内部で類似した内部データ型を持ち、型変換せずに比較できるようにする必要があります。 が型変換なしで比較できるようにする必要があります。整数型のサイズと符号 は同じでなければなりません。文字列型の長さは、同じである必要はありません。以下の場合 非二値(文字)文字列列の場合、文字セットと照合順序は同じでなければならない。 は同じでなければならない。