2017-04-24 18 views
2

次のSQLスクリプトは、MySQL 5.16.17以前では動作しますが、では動作しません。MySQL 5.7.18のインストールではMySQL 5.7.18:NULLからNOT NULLへの外部キー制約とALTER TABLE CHANGE COLUMN

Error Code: 1832. Cannot change column 'foo_id': used in a foreign key constraint 'bar_ibfk_1' 

問題は外部キー制約からでカラムを変更しているようだ:一つは、ドッカーコンテナに発売のMySQL 5.7.18は、

drop table if exists bar; 
drop table if exists foo; 

create table foo (foo_id int not null primary key, description varchar(32)); 
insert into foo values ("1", "foo-one"); 
insert into foo values ("2", "foo-two"); 

create table bar (bar_id int not null primary key, foo_id int null, description varchar(32), foreign key (foo_id) references foo(foo_id)); 
insert into bar values ("1", "1", "bar-one"); 
insert into bar values ("2", "1", "bar-two"); 

alter table bar change column foo_id foo_id int not null; 

エラーメッセージがある)としてもOKですNULLからNOT NULL。

「SET foreign_key_checks ...」コールで最後のステートメントをラップすることができますが、この場合はMySQLの動作に影響を与えるシステム変数や構成設定があるかどうかに関心があります。私は2つの5.7.18のインスタンス間で異なる動作を説明することはできません。

+0

にFOREIGN_KEY_CHECKSを設定することができます。 'SQL_MODE'変数の値を教えてください。 [db-fiddle](https://www.db-fiddle.com/f/xtPue5iZnMoHhR5S7cBQKZ/2)を参照してください。 5.7.18ローカルインストールで – wchiquito

+0

のsql_mode: NO_AUTO_CREATE_USER、5.7.18ドッカーコンテナ内NO_ENGINE_SUBSTITUTION のsql_mode: ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION ローカルで(はい、I無効STRICT_TRANS_TABLESインストールされているインスタンスに影響がないかどうかを確認してください) – ndeuma

+0

db-fiddleでは、スニペットは5.6で失敗し、5.5と5.7で動作します。面白い... – ndeuma

答えて

1

あなたは、私が問題を再現することはできませんゼロ

SET FOREIGN_KEY_CHECKS = 0; 

alter table bar change column foo_id foo_id int not null; 

SET FOREIGN_KEY_CHECKS = 1;