MySQL服务器版本: 5.6.17我有两个表:
vatband:
`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;vatbands中的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的情况下插入items表时,我会得到外键约束失败:
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表的外键的引用操作受以下条件影响: 虽然SET默认设置是MySQL服务器允许的,但InnoDB拒绝它为无效。
这就是它失败的原因吗?
更新:
如果我直接使用PHP输入一个值:
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');约束按预期成功。
发布于 2014-09-20 01:46:36
外键的SET DEFAULT子句与插入子表无关。如果父表中的引用行被删除或更新,则声明如何处理子表中的依赖行。
示例:如果员工属于某个部门,并且该部门被删除,那么是否也应该解雇该员工?还是应该重新分配到其他“默认”部门?
我测试了您的示例,发现它运行良好,但您必须至少指定父表中存在的client_id。
mysql> insert into items (client_id) values (1);
Query OK, 1 row affected (0.00 sec)我还注意到,您在vatband on (代码,client_id)中的键是一个非唯一的键。它应该是由子表的外键引用的主键或唯一键。事实上,当我使用MySQL 5.7里程碑版本进行测试时,我甚至不能创建items表,因为在这方面,MySQL的新版本显然比旧版本更严格。所以我得把你的钥匙当成主钥匙。然后测试成功了。
发布于 2014-09-20 12:11:19
让它工作的唯一方法是使用PHP插入默认设置。
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');如果有人有更好的方法来解决这个问题,请不要犹豫,我更喜欢纯MySQL方法。
发布于 2014-09-20 12:11:56
如果你使用:
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', '');不是插入NULL,而是插入空字符串。
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', NULL);行得通
https://stackoverflow.com/questions/25944246
复制相似问题