在多个mysql表之间保留更新的mysql数据

时间:2013-01-28 14:35:57

标签: php mysql triggers

我在mysql中有两个表。当我在第一个表中插入/删除值时,我希望表2中的值重复,以使它们“对齐”。

表1:
id - 用户名
1 - test_user
表2:

与table1相同的id和与table1相同的用户名(插入/删除时)

我希望保持表之间的数据对齐而不进行多次查询。我读过关于触发器的不确定是不是正确的道路,我是一个好人 我说两个表但我需要在多个表中执行此操作。

3 个答案:

答案 0 :(得分:1)

您可以使用Mysql触发器。这样您就可以从第二个表中自动插入/更新/删除数据。

MySql Using Triggers

答案 1 :(得分:1)

当您INSERT新记录时,由于某些原因您不想进行两次插入,插入第二个表的using a trigger将起作用。对于UPDATEDELETE,您可能希望使用foreign keys查看CASCADE选项。如果你所做的就是保持表之间的数据一致,那就是cascade的用途。

创建table2时,只需添加如下所示的外键:

FOREIGN KEY (id, username) 
  REFERENCES table1(id, username) ON UPDATE CASCADE ON DELETE CASCADE

然后,每当您更改table1时,更改将自动推送到table2。

将此工作的先决条件结合起来:

  1. 您必须使用支持外键的storage engine,例如InnoDB而不是MyISAM
  2. 您需要在table1中拥有(id,username)的索引; foriegn密钥需要匹配父表中的密钥
  3. 您应该阅读foreign keys的文档页面。还有其他一些方法可以调整它们,你应该找出最适合你的目的。

答案 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服务器实例。

正式的关系数据库设计原则教会我们复制数据,而是使用视图和连接来按照应用程序查看数据的方式构建数据。