MySQL服务器版本:5.6.17 我有两个表:澄清 - 默认外键约束 - InnoDB的
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行中vatbands:
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无效,因此 无效。
这是它失败的原因吗?
UPDATE:
如果我输入的值直接使用PHP:
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');
约束成功按预期方式。
'SET DEFAULT'指的是一个外键约束作用:'... ON DELETE SET DEFAULT'。 – rcdmk 2014-09-20 01:15:10
请打开http://sqlfiddle.com/并在此处张贴链接。 – rcdmk 2014-09-20 01:16:33
@rcdmk好的,这很有道理,谢谢。 – Edward 2014-09-20 01:16:58