mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段相关的知识,希望对你有一定的参考价值。

例如我现在想设计一个订单的数据库,其中一个表为“订单”,另一个表为“地址”。
“订单”表中有2个字段分别为“发件地址id”和“收件地址id”,我现在想将这2个字段设置外键同时与“地址”表中的“地址id”这个字段关联。请问可以做到么?sql语句怎么编写?
想达到的效果是:
“订单”表中的“发件地址id”和“收件地址id”这两个字段的内容,都必须是“地址”表中“地址id”这个字段里已经有的内容。且假设当我删除“地址”表中“地址id”为1的某条记录时,“订单”表中无论是“发件地址id”还是“收件地址id”,只要包含id为1这个信息的所有相关记录都会级联删除。

参考技术A 你要订单表中两个字段引用地址表中的一个字段,那你就在订单表中创建两个外键就行了:
ALTER TABLE order ADD CONSTRAINT address1 FOREIGN KEY (address_id) REFERENCES address;
ALTER TABLE order ADD CONSTRAINT address2 FOREIGN KEY (address_id) REFERENCES address;
你要删除的话:
delete from order where address1 = '1001' or address2 = '1001';

像这些数据,不建议做物理删除,也就是delete。你可以加一个状态字段,将它标识为无效就可以了。因为这些数据,对业务进行一些统计和数据分析都是有用的。再比如,我使用地址1下过一些订单,现在我搬家了,地址1就没用了,我要换另外一个地址。那我会删除地址1,再添加一个地址2,但我地址1的订单还是要看的吧,你总不能删除啊。而且在地址1的订单中,我要能看到地址1的地址信息。所以,这里对于地址删除,那就不能做delete了,只能做标识。标识无效后,只能代表地址在下单选择地址或一些其它操作的时候,这个无效的地址不显示,但在查看订单的时候,这个地址信息还是能显示出来的。
这个具体哪可以显示,哪不能显示,就要根据你的业务和实际情况来定了本回答被提问者采纳
参考技术B 可以的。追问

请看我的问题补充,能否帮我解释一下应该如何操作

mysql表中,表的外键关联自身主键,为啥插入不了数据?

出现java.sql.SQLException: Cannot add or update a child row: a foreign key constraint fails

参考技术A 外键为空或者重复追问

外键设置的可以为null,现在数据库中总没有任何数据,在插入的时候不允许插入,出现错误。。。

追答

是不是插入字段对应不对,写错字段名了?

参考技术B 外键数据的值,必须是主键值的拷贝。 参考技术C 中有双鲤鱼,相戏碧波间。

以上是关于mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段的主要内容,如果未能解决你的问题,请参考以下文章

mysql表中,表的外键关联自身主键,为啥插入不了数据?

SQL怎么写将表中的字段设置为主键后,由该表的另外一个字段作为外键.

sqlalchemy多外键关联

Laravel中从一个表到另一个表中的同一字段的多个外键

主键和外键的作用

主键和外键的作用