2017-04-24 2 views
2

Le script SQL suivant fonctionne avec MySQL 5.16.17 et plus ancien, mais pas avec un de mes installations MySQL 5.7.18 (l'autre un, MySQL 5.7.18 lancé dans un conteneur Docker, est bien aussi)MySQL 5.7.18: Contraintes de clé étrangère et ALTER TABLE CHANGE COLUMN de NULL à NOT NULL

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; 

Le message d'erreur est:

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

Les problèmes semble changer une colonne avec une contrainte de clé étrangère de NULL à NOT NULL. Je sais que je pourrais juste boucler la dernière déclaration dans un appel "SET foreign_key_checks ...", mais je serais intéressé de savoir s'il y a des variables système ou des paramètres de configuration qui influencent le comportement de MySQL dans ce cas, car Je ne peux pas expliquer le comportement différent entre deux instances 5.7.18.

+0

Je ne peux pas reproduire le problème. Vous pouvez nous indiquer la valeur de la variable 'SQL_MODE'. Voir [db-fiddle] (https://www.db-fiddle.com/f/xtPue5iZnMoHhR5S7cBQKZ/2). – wchiquito

+0

sql_mode dans 5.7.18 installation locale: NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION sql_mode dans 5.7.18 contenant Docker: 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 (Oui, je STRICT_TRANS_TABLES handicapés dans le local instance installée pour voir si cela a un effet, en vain) – ndeuma

+0

Avec db-fiddle, l'extrait échoue avec 5.6 et fonctionne avec 5.5 et 5.7. Intéressant ... – ndeuma

Répondre

1

vous pouvez définir FOREIGN_KEY_CHECKS à zéro

SET FOREIGN_KEY_CHECKS = 0; 

alter table bar change column foo_id foo_id int not null; 

SET FOREIGN_KEY_CHECKS = 1;