1

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

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

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

我想保持表之间的数据对齐而不进行多次查询。我读过关于触发器的文章,不确定这是否是正确的道路,我是个笨蛋。
我说两个表,但我需要在多个表中执行此操作。

4

3 回答 3

1

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

MySql 使用触发器

于 2013-01-28T14:38:39.267 回答
1

当您INSERT新建记录时,考虑到由于某种原因您不想进行两次插入,使用触发器插入第二个表将起作用。对于UPDATE并且DELETE您可能想查看CASCADE带有外键的选项。如果您所做的只是保持表之间的数据一致,那么这正是 cascade 的用途。

当您创建 table2 时,您只需添加一个外键,如下所示:

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

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

这个工作的几个先决条件:

  1. 您必须使用支持外键的存储引擎InnoDB,例如而不是MyISAM
  2. 您需要(id,username)在 table1 中有一个索引;外键需要匹配父表中的一个键
  3. 您应该阅读外键的文档页面。还有其他几种方法可以调整它们,您应该找出最适合您的目的的方法。
于 2013-01-28T14:53:14.300 回答
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 服务器实例。

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

于 2013-01-28T14:54:40.267 回答