【问题标题】:2 foreign keys linked sender and receiver in messages2个外键链接消息中的发送者和接收者
【发布时间】:2017-09-26 13:24:45
【问题描述】:

所以我有一个带有clientid 的客户表和一个带有spidserviceprovider 表。我想将它们链接到我的表messages 中,该表有一个发送者和接收者列。但是如果我将clientid和spid都引用给发送者和接收者,它似乎不起作用。

引用它们的好方法是什么?

【问题讨论】:

  • 如果发送者和接收者都是客户端,则应该将发送者和接收者作为客户端 ID 的外键
  • 澄清一下:客户和服务提供商都可以是消息的发送者和接收者?
  • 是的,我的计划是让他们既是发送者又是接收者
  • 外键无法处理这种情况。要么不能使用外键,要么需要更改表结构,以便所有客户端和服务提供者都存储在一个表中。
  • 我确实考虑过将 'clients' 和 'serviceproviders' 放在一个表中,但它们的列太不同了。那么就没有其他变通办法了吗?

标签: mysql foreign-keys schema foreign-key-relationship


【解决方案1】:

如果消息的发送者和接收者可以在服务提供者表上的任一客户端中,那么您不能使用外键来确保引用完整性。单个外键只能指向一个表。

如果您坚持使用单独的客户端和服务提供者表,那么您可以使用触发器而不是外键来确保引用完整性。

您将在消息表上定义插入/更新触发器,以检查发送者/接收者是否存在于 2 个表中的任何一个中,如果不存在则引发错误消息。您还必须确保没有客户端与服务提供者具有相同的 id,否则您将无法区分它们。

您将在客户端/服务提供商表上定义更新/删除触发器之前,以确保您不会修改具有相关消息的 id(或更新消息表中的 id)。

另一种选择是更改您的数据库结构并将客户端和服务提供者移动到一个表中。在这种情况下,您可以使用外键来确保数据的引用完整性。

【讨论】:

  • 客户和服务提供商有不同的 id 模式,所以我认为服务提供商和客户 id 没有任何问题
  • 所以我有一个大问题...如何使用触发器引用其他表? CREATE TRIGGER check_if_exist BEFORE INSERT ON messages FOR EACH ROW SET NEW.sender = (bxb.client.clientno) OR NEW.sender = (bxb.serviceprovider.spid) OR NEW.receiver = (bxb.client.clientno) OR NEW.sender = (bxb.serviceprovider.spid);这似乎不起作用
  • 请在他们自己的单独问题中提出后续问题,而不是在评论中。
  • 对不起。感谢您的澄清:>
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2013-08-13
  • 2014-10-12
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多