我在mysql中有两个表。当我在第一个表中插入/删除值时,我希望表2中的值重复,以使它们“对齐”。
表1:
id - 用户名
1 - test_user
表2:
与table1相同的id和与table1相同的用户名(插入/删除时)
我希望保持表之间的数据对齐而不进行多次查询。我读过关于触发器的不确定是不是正确的道路,我是一个好人
我说两个表但我需要在多个表中执行此操作。
答案 0 :(得分:1)
您可以使用Mysql触发器。这样您就可以从第二个表中自动插入/更新/删除数据。
答案 1 :(得分:1)
当您INSERT
新记录时,由于某些原因您不想进行两次插入,插入第二个表的using a trigger将起作用。对于UPDATE
和DELETE
,您可能希望使用foreign keys查看CASCADE
选项。如果你所做的就是保持表之间的数据一致,那就是cascade的用途。
创建table2时,只需添加如下所示的外键:
FOREIGN KEY (id, username)
REFERENCES table1(id, username) ON UPDATE CASCADE ON DELETE CASCADE
然后,每当您更改table1时,更改将自动推送到table2。
将此工作的先决条件结合起来:
InnoDB
而不是MyISAM
(id,username)
的索引; foriegn密钥需要匹配父表中的密钥答案 2 :(得分:0)
当您的应用程序更改table1时,您当然可以在table1上放置触发器以对其他表进行并行更改。
请参阅此处了解文档:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html
但是,你应该考虑一下你的设计。进行插入和更新需要多次查询;他们只是在服务器上“背后”完成。他们还需要时间。触发器可以真正减慢速度。
此外,触发器有点脆弱。如果向表中添加列,则必须重新设置触发器。触发通常是颈部疼痛,以保持在源控制系统和颈部的巨大疼痛测试,因此使用它们将使您的应用程序更难以维护。
你能想到另一种处理复制需求的方法吗?例如,您是否可以使用视图或连接向应用程序显示所需的数据,而无需实际复制表及其中的行?如果你弄清楚如何做到这一点,从长远来看你会更快乐。
CREATE VIEW table2 AS
SELECT *
FROM table1;
将生成一个带有table1内容的“假”table2。
或者,如果您希望仅在第二个表中查看测试用户,则视图也可以为您执行此操作,例如:
CREATE VIEW table3 AS
SELECT *
FROM table1
WHERE usertype = 'test_user' ;
如果您使用重复表进行“备份”,那么确保您的信息安全是一种不好的方法。相反,您需要备份MySQL服务器实例。
正式的关系数据库设计原则教会我们复制数据,而是使用视图和连接来按照应用程序查看数据的方式构建数据。