无法创建表'mydb.contact'(错误号:150)

时间:2016-03-16 17:16:03

标签: mysql sql mariadb mariasql

拜托,这是我的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)

3 个答案:

答案 0 :(得分:1)

在您的外键约束中,您已将删除操作设置为SELECT avg(sub.impressions) FROM ( WITH summary AS ( SELECT n.team, n.name, n.league, n.impressions, n.created_at, ROW_NUMBER() OVER(PARTITION BY n.team ORDER BY n.created_at DESC) AS rowcount FROM nielsen_data n WHERE n.name = 'Social Media - Twitter Followers' AND n.league = 'National Football League' ) SELECT s.* FROM summary s WHERE s.rowcount = 1) sub; ,但列set null不允许空值,因为它被指定为user_iduser,这使约束无效。更改列以允许空值或更改约束中的删除操作。

在线MySQL手册甚至有关于此的a warning

  

如果指定SET NULL操作,确保您尚未声明   子表中的列为NOT NULL

答案 1 :(得分:1)

您的语句ON DELETE SET NULL限制您创建表,因为您的列user_iduser在写入时不能为NULL

 user_iduser INT NOT NULL

答案 2 :(得分:0)

我知道在MySQL中,当出现外键约束问题时会返回此错误。此外 - 如果创建,删除和重新创建此表,则可能存在未排列的现有引用。