mysql - MySQL在插入外键之前检查父子字段是否匹配
问题描述
是否可以在子表中强制检查,其中字段必须与父表具有相同的值才能允许插入外键?
例如,假设我有下表
Parent Table
-------------
id
field1
field7
Child Table
-------------
id
field1
field2
parent_id (foreign key to parent table column "id")
field3
如果子表和父表中的“field1”具有相同的值,我只想允许在子表中插入 parent_id。
我想在应用程序逻辑中处理这个约束,但我很好奇 MySQL 是否有办法强制执行这个约束。
编辑:在这种情况下,子表与父表具有一对多的外键关系。子表列parent_id
引用父表列id
。所以除此之外,我只想插入给定子表“field1”值与给定“parent_id”引用值“field1”匹配的子表值
解决方案
这称为外键约束。最好的方法是将id
父表中的 定义为主键:
create table parent (
id <whatever type> primary key,
. . .
);
大多数数据库要求引用的键是主键或唯一键。尽管 MySQL 将此扩展到任何键(即任何具有索引的列),但坚持使用主键/唯一键。
在子表中,您可以声明外键引用:
alter table child add constraint fk_child_parent
foreign key (parent_id) references parent (id);
编辑:
我认为跨表重复值不是一个好主意。最好根据需要查找它们。但是,您可以使用外键做您想做的事情:
create table parent (
id <whatever type> primary key,
field1 . . .,
. . .
unique (field1, id)
);
alter table child add constraint fk_child_parent
foreign key (field1, parent_id) references parent (field1, id);
推荐阅读
- javascript - html 输入类型的更改=数字“可用”值。还将更改另一个输入 type=number "Total"
- c++ - 为什么 [=]{} 有 lambda 捕获?
- php - 按索引比较两个数组索引的差异
- neo4j - Cypher 查询 - 从 csv 文件创建图形
- javascript - 在 else 情况下 React 事件传播
- c# - Invalid URI error 从网页获取数据并匹配有效性
- java - Spring Data JPA:具有隔离 READ_COMMITTED 的事务看不到另一个事务中提交的数据
- java - 使用 netty 分配器为每个通道或每个请求创建 bytebuf?
- c# - Xml中的无效操作?
- electron - 如何从网站启动我的电子应用程序