【问题标题】:MySQL link tables - view, foreign keys or trigger?MySQL 链接表 - 视图、外键或触发器?
【发布时间】:2010-12-07 13:10:45
【问题描述】:

如果"link" 不是这个的确切术语,我深表歉意。

我有一张包含用户信息的表格,(用户和密码)。我需要相同的用户:密码对出现在同一数据库的另一个表中。第二个表需要始终复制第一个表 - 如果从第一个表中删除或添加条目 - 更改必须立即应用于第二个表。

拜托,我需要一个如何做到这一点的例子,因为我不知道在谷歌上搜索的术语..


我只需要两列是重复的,而不是整个表。

【问题讨论】:

  • 我同意 Unreason 的意见 - 为什么要保留重复信息?立即在第二个副本中添加和删除似乎没有任何作用。
  • 我刚刚在 Unreason 的帖子中解释了这一点
  • 我认为您正在寻找外键。使用正确的级联选项将引用第一个表的外键添加到第二个表,这就是您所需要的。在这种情况下,复制任何数据是不可接受的。如果是 MySQL,您必须使用 InnoDB 存储引擎才能工作(MyISAM 不支持外键等数据库完整性功能)。

标签: mysql triggers view foreign-keys


【解决方案1】:

view 可能会起作用,具体取决于现有系统和imposed by views 施加的限制。它节省了重复数据:

CREATE TABLE web_users (username VARCHAR(255), password VARCHAR(255));

CREATE VIEW forum_users AS SELECT username, password FROM web_users;

INSERT INTO web_users VALUES ('user1', 'password1');

SELECT * FROM forum_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
+----------+-----------+

INSERT INTO forum_users VALUES ('user2', 'password2');

SELECT * FROM forum_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+

SELECT * FROM web_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+

【讨论】:

【解决方案2】:

这可以通过触发器来完成。

真正的问题是你为什么要在数据库中有重复的信息。

【讨论】:

  • 一个表包含我网站的用户,另一个表属于我在网站内部实施的论坛 (CMS)。我需要我的网站和论坛的 user:pass 始终匹配。
  • 为什么不同时使用同一张表呢?如果您可以读取其中一个来更新另一个,那么访问似乎不是问题。
  • 论坛的表格列的名称与我在我的网站中使用的不同。两者都是完整的产品,更改“用户名”的每一个外观(作为列的名称)都需要很多时间..
  • 啊,我明白了。这只是我脑海中的一个想法,但是用view 替换其中一个表可能是更好的选择。这取决于 MySQL 视图的限制以及您是否可以删除其中一个表并用视图替换它。
【解决方案3】:

mysql中的术语叫做foreign key

你需要一个innodb storage engine 才能工作

详情:http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

但是,将natural key 用作foreign key 有一些缺点,
这个问题之前已经讨论过:How to choose my primary key?

【讨论】:

  • 我不认为外键约束与这个问题特别相关。这不是必需的触发器吗?
  • hmm..公开讨论,触发听起来合理,但考虑到键重复,自然键问题,我认为使用外键会更简洁
  • @Mike,外键可以实现为触发器;并且在这种情况下它可能适合 - 即使 FK 的要求是在按引用顺序引用的列上存在唯一索引 - 这将产生人为约束(由于唯一名称浪费空间并可能使更新变慢);否则它将是 1-1 个表,其中一个表作为 CASCADE UPDATE(可能还有 CASCADE DELETE)的引导,它可以达到与触发器相同的结果。它不是很优雅(建议实际关系)或灵活,但它应该可以工作。
  • @Unreason:感谢您的解释 - 这是一个有趣的想法。
  • @Mike - 我认为你的回答,观点甚至更少出汗
【解决方案4】:

实现此类要求的有效方法是通过database trigger

【讨论】:

    【解决方案5】:

    使用storage engine as INNODB in mysql 并在其中进行索引

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多