【发布时间】:2014-09-20 01:06:18
【问题描述】:
MySQL 服务器版本:5.6.17 我有两张桌子:
vatbands:
`vatbands_id` INT(11) UNSIGNED NOT NULL,
`client_id` INT(11) UNSIGNED NOT NULL COMMENT 'Customer ID',
`code` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL,
PRIMARY KEY (`vatbands_id`, `code`, `client_id`),
INDEX `vatcode_vatbands` (`code` ASC, `client_id` ASC)
ENGINE = InnoDB;
1 行增值税:
INSERT INTO `vatbands` (`client_id`, `code`) VALUES ('1', 'A');
项目:
`client_id` INT(11) UNSIGNED NOT NULL,
`vatcode` ENUM('A', 'B', 'C', 'D', 'E', 'F') NOT NULL DEFAULT 'A',
PRIMARY KEY (`item_id`, `client_id`),
INDEX `vatcode_item` (`vatcode` ASC, `client_id` ASC),
CONSTRAINT `vatcode_item`
FOREIGN KEY (`vatcode` , `client_id`)
ENGINE = InnoDB;
插入子(项目)表:
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', '');
当我尝试插入我的项目表而不指定 vatcode 时,我得到外键约束失败:
Cannot add or update a child row: a foreign key constraint fails (`mydb`.`item`, CONSTRAINT `vatcode_item` FOREIGN KEY (`vatcode`, `client_id`) REFERENCES `vatbands` (`code`, `client_id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
为什么会这样,我认为为 vatcode 指定一个默认值会允许这种情况继续下去(只要该行存在)?
我查看了 InnoDB 手册:
14.6.6 InnoDB 和外键约束
InnoDB 表的外键的引用操作受制于 以下条件:
虽然 MySQL 服务器允许 SET DEFAULT,但它被拒绝为 InnoDB 无效。
这是失败的原因吗?
更新:
如果我直接使用 PHP 输入一个值:
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');
约束按预期成功。
【问题讨论】:
-
SET DEFAULT指的是外键约束操作:... ON DELETE SET DEFAULT。 -
请发sqlfiddle.com 并在此处发布链接。
-
@rcdmk 好的,有道理,谢谢。
-
@rcdmk 构建模式正在花时间得到“数据截断错误”,如果这有帮助吗? - 我可以发布。
-
@rcdmk 我无法让 sqlfiddle 构建架构,它只是挂起...
a timeout occurred on a exclusive lock with name [2_ed990] after 60 seconds这是我所得到的(缺少可以在我的问题)sqlfiddle.com/#!2/a9f00
标签: mysql sql foreign-keys innodb default-value