138

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

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;
4

5 に答える 5

146

外部キー フィールドと参照の型と定義は等しくなければなりません。これは、外部キーがフィールドの型を変更できないことを意味します。

1つの解決策は次のとおりです。

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;

編集: コメントのおかげで、上記のロックを追加しました

これを行う間、データベースへの書き込みを禁止する必要があります。そうしないと、データの整合性の問題が発生する危険があります。

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

自分の ( ) 以外のセッションでのすべての書き込みクエリは、タイムアウトまたは;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 Constraints

外部キーと参照されるキーの対応する列は、型変換なしで比較できるように、InnoDB 内で同様の内部データ型を持っている必要があります。整数型のサイズと符号は同じでなければなりません。文字列型の長さは同じである必要はありません。非バイナリ (文字) 文字列列の場合、文字セットと照合は同じである必要があります。

于 2012-11-28T13:58:43.027 に答える
0

私の場合、追加する必要がありましたGLOBAL

SET FOREIGN_KEY_CHECKS = 0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;
SET GLOBAL FOREIGN_KEY_CHECKS=1;
于 2022-02-16T17:33:03.813 に答える
0

問題のテーブルの構造タブに移動します。アクションの下にインデックスがあります。それらをドロップします

必要な変更が完了したら、外部キーを元に戻し、削除されたインデックスを復元します。次に、構造が同じで変更されていないことを確認します

于 2021-11-28T01:28:32.260 に答える
-3

キー (主キーまたは外部キー) を設定すると、キーの使用方法に制約が設定され、その結果、キーでできることが制限されます。本当に列を変更したい場合は、制約なしでテーブルを再作成できますが、お勧めしません。一般的に言えば、何かをしたいのに制約によって妨げられている状況がある場合、制約ではなくやりたいことを変更することで解決するのが最善です。

于 2012-11-28T13:48:03.890 に答える