MySQL级联表

时间:2013-08-28 15:49:16

标签: mysql

(我的网站是使用PHP和MySQL构建的。)

我的用户数据库结构主要由2个表组成:“医生”和“客户”。

但是,为了集成聊天系统,我需要创建第三个表,即'chat_users',它结合了医生和客户:'chat_users'表的字段是

    userid (unique integer),
    username,
    type (0:client, 1:doctor),
    refid (id of the user in the associated clients or doctors table)

但是每次插入/更新/删除客户端或医生时,我都不想手动插入/删除/更新此表。我前段时间听说过级联表......

这样做的最佳方式是什么?我怎样才能实现它?

4 个答案:

答案 0 :(得分:1)

你需要的是一个AFTER INSERT触发器。这将允许您创建新用户。如果您希望在更新时更新它并在删除原始记录时删除,那么您也需要这些触发器。

CREATE TRIGGER `chat_users_insert` AFTER INSERT ON `doctors` 
    FOR EACH ROW BEGIN
    INSERT INTO `chat_users` SET user_id= NEW.id;
    END;

上面会插入一条记录并设置id的值。 http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html可以为您提供准确的语法。如果您需要任何具体说明,请与我们联系。

答案 1 :(得分:1)

我不确定你会认为这是一个“答案”,但我可以评论你的数据库架构吗?

从长远来看,如果有下列表格,你会更开心:

user_account: (ua_id, ua_email, ua_username, ua_password, etc.)
doctor: (d_id, ua_id, etc.)
customer: (c_id, ua_id, etc.)

换句话说,让你的关系走向另一个方向。然后,如果您希望通过简单地删除user_account来删除医生或客户,您可以添加以下关系约束:

ALTER TABLE `doctor`
  ADD CONSTRAINT `doctor_fk_user_account` FOREIGN KEY (`ua_id`) REFERENCES `user_account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `customer`
  ADD CONSTRAINT `customer_fk_user_account` FOREIGN KEY (`ua_id`) REFERENCES `user_account` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

答案 2 :(得分:1)

我知道,不完全是您问题的答案,但是使用旧式视图呢?这样可以避免完全存储冗余数据。

CREATE VIEW chat_users AS
SELECT drid    uid, drid userid,  drname username, 0  FROM doctors
UNION ALL
SELECT clid+100000, clid,         clname,          1  FROM clients

只有当您的表中没有超过100000名医生时,此视图才会有唯一的uid(否则请选择更高的偏移量)。这种方法的优点是不需要维护依赖表数据。

答案 3 :(得分:1)

“每次插入/更新/删除客户端或医生时,我都不想手动插入/删除/更新此表。”

你为什么要担心这件事?去做就对了。您有应用程序要求,因此除非您能够弄清楚如何统一您的客户和医生表,否则需要与您的聊天功能相关的第三个。

在应用程序框架中添加它的难度几乎为零,只是在创建客户端或医生时创建附加记录,并在删除相应记录时删除它。

此处的其他答案建议使用视图或触发器来模糊实际发生的事情。这通常是一个坏主意,这意味着您的应用程序不负责自己的数据,基本上将某些应用程序逻辑功能的控制权移交给数据库本身。

最好的解决方案往往是最明显的,因为这会减少未来的意外。