我有以下表格:
// 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)
您需要先声明外键引用的表,然后才能定义引用它的外键。
一旦声明了第二个表,就可以声明第一个表。在 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
| 归档时间: |
|
| 查看次数: |
34581 次 |
| 最近记录: |