[解決済み] 外部キー制約で使用されるカラムを変更できない
質問
テーブルを変更しようとすると、このエラーが発生しました。
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内部で類似した内部データ型を持ち、型変換せずに比較できるようにする必要があります。 が型変換なしで比較できるようにする必要があります。整数型のサイズと符号 は同じでなければなりません。文字列型の長さは、同じである必要はありません。以下の場合 非二値(文字)文字列列の場合、文字セットと照合順序は同じでなければならない。 は同じでなければならない。
関連
-
MySQLデータベース・インデックスの左端一致の原則
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
[解決済み】DynamoDB : 提供されたキー要素がスキーマと一致しません。
-
sql エラーを解決する オペランドには1つの列が含まれている必要があります。
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] なぜ SQLAlchemy の count() は生のクエリよりずっと遅いのでしょうか?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] utf8_general_ciとutf8_unicode_ciの違いは何ですか?
-
[解決済み] MySQLで外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み】既存テーブルへの外部キー追加
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLのデータバックアップにmysqldumpを使用する方法
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
mysqlにおけるvarcharの日付比較とソートの実装
-
SQL基本クエリステートメント
-
mysqlのデータ圧縮性能比較 詳細
-
Mysqlデータベースの手動および定期的なバックアップ手順
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
[解決済み] Ubuntu linux上で動作するリモートMySQLサーバーを再起動する方法は?
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。