MySQL 在插入外键之前检查父子字段是否匹配

标签 mysql sql

是否可以在子表中强制执行检查,其中字段必须与父表具有相同的值以允许插入外键?

例如,假设我有下表

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);

关于MySQL 在插入外键之前检查父子字段是否匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575755/

相关文章:

mysql - RDBMS 中有序列表最合适的数据结构?

php - 合并多行然后离开 join-php mysql

sql - 仅当相同值的列不存在时 Postgres 才更新列

SQL错误: Column name or number of supplied values does not match table definition

MySQL 优化一个请求

SQL:获取所有带有任何评论的帖子

MySQL导入命令仅返回帮助信息

passwords - 恢复 MySQL 数据库的问题 - mysqldump 问题

mysql - Rails 4.1 - 无需类型转换即可写入 MySQL 数据库

php - 如何计算某列与另一个表的列匹配的行数