Невозможно создать таблицу mydb.contact (ошибка: 150)

Пожалуйста, это мой sql скрипт

#-- creation de la table user
CREATE TABLE IF NOT EXISTS user(
  iduser int AUTO_INCREMENT,
  nom VARCHAR(50) NOT NULL,
  prenom VARCHAR(50) ,
  adressemail VARCHAR(200) NOT NULL,
  motdepasse VARCHAR(200) NOT NULL,
  CONSTRAINT pk_user PRIMARY KEY(iduser)
);


#-- creation de la table user
CREATE TABLE IF NOT EXISTS contact(
  idcontact INT AUTO_INCREMENT,
  nom VARCHAR(45) NOT NULL,
  prenom VARCHAR(45),
  adressemail VARCHAR(200) UNIQUE,
  user_iduser INT NOT NULL,
  CONSTRAINT pk_contact PRIMARY KEY(idcontact),
  CONSTRAINT fk_contact_userIduser_user FOREIGN KEY (user_iduser) REFERENCES user(iduser) ON DELETE SET NULL ON UPDATE CASCADE
);

Когда я выполняю его в своей базе данных maria db, я получаю эту ошибку:

Can't create table 'mydb.contact' (errno: 150)


person hubert    schedule 16.03.2016    source источник


Ответы (3)


В ограничении внешнего ключа вы установили действие при удалении на set null, но столбец user_iduser не допускает нулевых значений, поскольку он указан как not null, что делает ограничение недействительным. Либо измените столбец, чтобы разрешить нулевые значения, либо измените действие удаления в ограничении.

В интерактивном руководстве по MySQL даже есть предупреждение об этом:

Если вы указываете действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL.

person jpw    schedule 16.03.2016

Ваш оператор ON DELETE SET NULL ограничивает вас для создания таблицы, поскольку ваш столбец user_iduser не может быть NULL, как вы написали

 user_iduser INT NOT NULL
person FallAndLearn    schedule 16.03.2016
comment
Это не первичный ключ, для которого установлено значение NULL, это внешний ключ в справочной таблице, и проблема в том, что он не имеет значения NULL. - person jpw; 16.03.2016
comment
да. Я также имею в виду то же самое, что и первичный ключ в отдельной таблице. - person FallAndLearn; 16.03.2016
comment
iduser - это первичный ключ в таблице пользователей, а user_iduser - это внешний ключ, который ссылается на iduser. Итак, он не может быть нулевым - person FallAndLearn; 16.03.2016
comment
Да user_iduser не находится в контакте PK. Но это ссылка на первичный ключ, который является iduser. Значит, он не может быть нулевым - person FallAndLearn; 16.03.2016
comment
Конечно, это может быть ноль. Ограничение применяется только для ненулевых данных. См. Это для получения дополнительной информации: stackoverflow.com/questions/2366854/ - person jpw; 16.03.2016
comment
Это означает, что внешнему ключу можно присвоить значение null, если он не объявлен ненулевым? - person FallAndLearn; 16.03.2016
comment
Да, именно это и означает. - person jpw; 16.03.2016
comment
Спасибо за обмен знаниями - person FallAndLearn; 16.03.2016

Я знаю, что в MySQL эта ошибка возвращается, когда возникает проблема с формированием ограничений внешнего ключа. Вдобавок - если эта таблица была создана, удалена и воссоздана заново, может существовать ссылка, которая не совпадает.

person mattcousineau    schedule 16.03.2016