首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >澄清-默认外键约束- InnoDB

问澄清-默认外键约束- InnoDB
EN

Stack Overflow用户
提问于 2014-09-20 01:06:18
回答 3查看 169关注 0票数 0

MySQL服务器版本: 5.6.17我有两个表:

vatband:

代码语言:javascript
复制
`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行:

代码语言:javascript
复制
INSERT INTO `vatbands` (`client_id`, `code`) VALUES ('1', 'A');

项目:

代码语言:javascript
复制
`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;

插入子表(项)表:

代码语言:javascript
复制
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', '');

当我尝试在没有指定vatcode的情况下插入items表时,我会得到外键约束失败:

代码语言:javascript
复制
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输入一个值:

代码语言:javascript
复制
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');

约束按预期成功。

EN

回答 3

Stack Overflow用户

发布于 2014-09-20 01:46:36

外键的SET DEFAULT子句与插入子表无关。如果父表中的引用行被删除或更新,则声明如何处理子表中的依赖行。

示例:如果员工属于某个部门,并且该部门被删除,那么是否也应该解雇该员工?还是应该重新分配到其他“默认”部门?

我测试了您的示例,发现它运行良好,但您必须至少指定父表中存在的client_id。

代码语言:javascript
复制
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的新版本显然比旧版本更严格。所以我得把你的钥匙当成主钥匙。然后测试成功了。

票数 1
EN

Stack Overflow用户

发布于 2014-09-20 12:11:19

让它工作的唯一方法是使用PHP插入默认设置。

代码语言:javascript
复制
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', 'A');

如果有人有更好的方法来解决这个问题,请不要犹豫,我更喜欢纯MySQL方法。

票数 0
EN

Stack Overflow用户

发布于 2014-09-20 12:11:56

如果你使用:

代码语言:javascript
复制
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', '');

不是插入NULL,而是插入空字符串。

代码语言:javascript
复制
INSERT INTO `item` (`client_id`, `code`) VALUES ('1', NULL);

行得通

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25944246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档