我在mysql中有两个表。当我在第一个表中插入/删除值时,我希望这些值在表 2 中重复以保持它们“对齐”。
表1:
id - 用户名
1 - test_user表 2
:
与 table1 相同的 id 和与 table1 相同的用户名(在插入/删除时)
我想保持表之间的数据对齐而不进行多次查询。我读过关于触发器的文章,不确定这是否是正确的道路,我是个笨蛋。
我说两个表,但我需要在多个表中执行此操作。
您可以使用 Mysql 触发器。这样您就可以从第二个表中自动插入/更新/删除数据。
当您INSERT
新建记录时,考虑到由于某种原因您不想进行两次插入,使用触发器插入第二个表将起作用。对于UPDATE
并且DELETE
您可能想查看CASCADE
带有外键的选项。如果您所做的只是保持表之间的数据一致,那么这正是 cascade 的用途。
当您创建 table2 时,您只需添加一个外键,如下所示:
FOREIGN KEY (id, username)
REFERENCES table1(id, username) ON UPDATE CASCADE ON DELETE CASCADE
然后,每当您更改 table1 时,更改将自动推送到 table2。
这个工作的几个先决条件:
您当然可以在您的 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 服务器实例。
正式的关系数据库设计原则教我们复制数据,而是使用视图和连接来按照应用程序需要查看数据的方式构建数据。