我有以下表格:
// 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
当我放入该外键约束时,尝试保存第一个表失败。想不通为什么。约束中引用的两个列具有相同的类型、大小等:
INT(10) UNSIGNED NULL
它们只有一个不同的默认值。一个有一个默认值 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) */
您需要已经声明了外键引用的表,然后才能定义引用它的外键。
一旦你声明了第二个表,你就可以声明第一个表。在MySQL 5.5.27 上测试。
如果您需要绕过验证,可以这样做:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks
使用查询 1 和 2 删除表
1) 设置 FOREIGN_KEY_CHECKS = 0;
2) 删除表表名;
这里是TableName,你要删除哪个表