Невозможно добавить ограничение внешнего ключа

Когда я пытаюсь создать таблицу с именем Sales, MySQL выдает следующую ошибку. Я не могу сказать, в чем проблема, и я просмотрел http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-constraints.html, чтобы увидеть, какую ошибку я сделал, но я не могу сказать. Я получаю эту ошибку в 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)
);

person user3015939    schedule 21.11.2013    source источник
comment
Пожалуйста, покажите вашу Guns таблицу   -  person peterm    schedule 21.11.2013
comment
Одной из причин может быть последовательность, в которой вы создаете таблицы (создаете дочерние таблицы перед родительскими), установленную foreign_key_checks=0 в начале вашего DDL-скрипта. Таким образом, порядок создания не создает проблем.   -  person SajjadHashmi    schedule 21.11.2013
comment
Я это уже пробовал, не получилось. Сначала я создал покупки, затем оружие, затем попробовал продажи, и это не сработало.   -  person user3015939    schedule 21.11.2013
comment
SerialSold должен быть уникальным, чтобы вы никогда не могли продать одно и то же оружие дважды за время существования вашего приложения? Это может быть желаемой функциональностью, но я могу представить сценарий, в котором вы окажетесь с непродаваемыми предметами, потому что ваше программное обеспечение не позволяет их продавать ... Если я куплю оружие, продаю его вам, вы больше не сможете его продать. .   -  person oerkelens    schedule 21.11.2013


Ответы (1)


Вы определили поле serialsold как не обнуляемое -

serialsold VARCHAR( 20 ) UNIQUE NOT NULL

но затем вы пытаетесь добавить действие с предложением SET NULL -

ON DELETE SET NULL

Измените один из этих параметров и попробуйте создать таблицу.

person Devart    schedule 21.11.2013
comment
@user3015939 user3015939 Если это сработало для вас, отметьте ответ как принятый< /а>. - person peterm; 21.11.2013