外键约束失败

Jak*_*son 3 mysql foreign-key

我有以下表格:

// Base Scans
CREATE TABLE `basescans` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NULL DEFAULT NULL,
    `status_id` INT(10) UNSIGNED NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    CONSTRAINT `status_id_fk` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`) ON UPDATE CASCADE ON DELETE SET NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=29

// Statuses
CREATE TABLE `statuses` (
    `id` INT(10) UNSIGNED NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=4
Run Code Online (Sandbox Code Playgroud)

当我放入该外键约束时,尝试保存第一个表失败。想不通为什么。约束中引用的两列具有相同的类型、大小等:

INT(10) UNSIGNED NULL
Run Code Online (Sandbox Code Playgroud)

它们只有不同的默认值。一个的默认值是 NULL,另一个是 AUTO_INCREMENT。我认为这对外键约束没有影响,但我可能是错的。

两个表都是 InnoDB 和 UFT8。我在这里缺少什么?

更新:我的具体错误:

/* SQL Error (1452): Cannot add or update a child row: a foreign key constraint fails (`db`.<result 2 when explaining filename '#sql-31c2_22ac1e1'>, CONSTRAINT `status_id_fk` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) */
Run Code Online (Sandbox Code Playgroud)

Mic*_*bot 6

您需要先声明外键引用的表,然后才能定义引用它的外键。

一旦声明了第二个表,就可以声明第一个表。在 MySQL 5.5.27 上测试

如果您需要绕过验证,您可以这样做:

SET FOREIGN_KEY_CHECKS = 0;
-- declare tables
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks