Mysql 无法添加外键约束

Mysql 无法添加外键约束,mysql,sql,foreign-keys,create-table,Mysql,Sql,Foreign Keys,Create Table,当我尝试创建一个名为Sales的表时,MySQL给出了以下错误。我不知道问题出在哪里,我看了一眼,想知道我犯了什么错误,但我说不出来。 我在MySQL 5.6.11中遇到了这个错误,但在5.1.67中没有 Error SQL query: CREATE TABLE IF NOT EXISTS Sales( name VARCHAR( 30 ) NOT NULL , address VARCHAR( 70 ) NOT NULL , serialsold VARCHAR( 20 ) UNIQUE

当我尝试创建一个名为Sales的表时,MySQL给出了以下错误。我不知道问题出在哪里,我看了一眼,想知道我犯了什么错误,但我说不出来。 我在MySQL 5.6.11中遇到了这个错误,但在5.1.67中没有

Error
SQL query:

CREATE TABLE IF NOT EXISTS Sales(

name VARCHAR( 30 ) NOT NULL ,
address VARCHAR( 70 ) NOT NULL ,
serialsold VARCHAR( 20 ) UNIQUE NOT NULL ,
background_check VARCHAR( 9 ) NOT NULL ,
soldfor FLOAT NOT NULL ,
datesold TIMESTAMP DEFAULTNOW( ) ,
FOREIGN KEY ( serialsold ) REFERENCES Guns( serialnumber ) ON DELETE SET NULL ON UPDATE CASCADE ,
PRIMARY KEY ( background_check )
);

MySQL said: Documentation

#1215 - Cannot add foreign key constraint 
我的枪和购买表:

CREATE TABLE IF NOT EXISTS Purchases
(
    name          VARCHAR(30) NOT NULL,
    address       VARCHAR(70) NOT NULL,
    serialbought  VARCHAR(20) UNIQUE NOT NULL,
    boughtfor     FLOAT,
    datebought    TIMESTAMP DEFAULT NOW(),
    PRIMARY KEY (serialbought)
);

CREATE TABLE IF NOT EXISTS Guns
( 
  sequence      INTEGER(4)  NOT NULL AUTO_INCREMENT,
  manufacturer  VARCHAR(30) NOT NULL,
  model         VARCHAR(20) NOT NULL,
  caliber       VARCHAR(10) NOT NULL,
  serialnumber  VARCHAR(20) UNIQUE NOT NULL,
  type          VARCHAR(10) NOT NULl,
  sellsfor      FLOAT DEFAULT NULL,
  FOREIGN KEY (serialnumber) REFERENCES Purchases(serialbought)
    ON DELETE RESTRICT ON UPDATE RESTRICT,
  PRIMARY KEY (sequence)
);
您将字段SerialSell定义为不可为空-

serialsold VARCHAR( 20 ) UNIQUE NOT NULL
但是,您正在尝试使用SETNULL子句添加操作-

ON DELETE SET NULL
更改其中一个选项并尝试创建表。

您将字段SerialSeld定义为不可为空-

serialsold VARCHAR( 20 ) UNIQUE NOT NULL
但是,您正在尝试使用SETNULL子句添加操作-

ON DELETE SET NULL

更改其中一个选项,然后尝试创建表。

请显示您的表。原因之一可能是您在DDL脚本开始时,在父母设置foreign_key_checks=0之前创建表并创建子表的系列。因此,按创建顺序不会产生问题。我已经尝试过了,但没有成功。我先创建了购买,然后创建了枪,然后尝试了销售,但没有成功。SerialSeld必须是唯一的,所以在应用程序的生命周期内,您不能两次销售同一支枪?这可能是理想的功能,但我可以想到的情况是,您最终无法销售的项目,因为您的软件不允许销售它。。。如果我买了枪,把它卖回去,你就不能再卖了。请出示你的枪表。原因之一可能是在父母在DDL脚本开始时设置foreign_key_checks=0之前,你正在创建表来创建子表。所以按创建顺序不会产生问题。我已经尝试过了,但没有成功。我先创建了购买,然后创建了枪,然后尝试了销售,但没有成功。SerialSeld必须是唯一的,所以在应用程序的生命周期内,您不能两次销售同一支枪?这可能是理想的功能,但我可以想到的情况是,您最终无法销售的项目,因为您的软件不允许销售它。。。如果我买了枪,把它卖给你,你就不能再卖了。@user3015939如果对你合适,请将答案标记为。@user3015939如果对你合适,请将答案标记为。