【问题标题】:MySQL : Automatic column update with list of valueMySQL:使用值列表自动更新列
【发布时间】:2013-11-03 12:20:44
【问题描述】:

我只想自动更新与外键链接的 2 个表的列。 更重要的是,这些列不仅必须包含一个值,还必须包含一个值列表。

这是我的例子:

Table Name : members
Member name : Demo User
Assigned Tasks : <List of tasks assigned to "Demo User">

Table Name : tasks
Task Name : Modeling
Assigned To : <List of users assigned to "Modeling">

在每个表中,我希望能够在列中插入值,而另一个表自动更新。

例子:

Table Name : members
Member name : Demo User
Assigned Tasks : Modeling,Mapping

Table Name : tasks
Task Name : Modeling
Assigned To : AUTOMATIC UPDATE ->Demo User

Task Name : Mapping
Assigned To : AUTOMATIC UPDATE ->Demo User

我尝试使用外键(使用innoDB),但我只是成功在列中插入一个值,而另一个表没有自动更新...

感谢您的帮助!

【问题讨论】:

  • 更改您的数据模型。至少成员和任务之间存在一对多的关系(成员可以拥有多个任务)。如果一项任务可以分配给多个成员,则它是多对多关系。如果您不知道存储这些数据的规范化方式,我听说过这本书的好东西,即为凡人设计的数据库。
  • 我知道你的意思,但你不认为为每个成员或任务创建表会创建一个巨大的数据库,这可能会变得不稳定吗?
  • 为每个成员或任务创建表格也不是规范化设计。

标签: mysql sql indexing foreign-keys


【解决方案1】:

永远不要在数据库中存储分隔值。通过创建一个多对多表(在您的情况下我们称之为assigned_tasks)来规范化您的数据。从长远来看,这将使您能够正常维护和查询数据,从而获得巨大的回报。

话虽如此,您的架构可能看起来像

CREATE TABLE members
(
  member_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  member_name VARCHAR(32)
);
CREATE TABLE tasks
(
  task_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  task_name VARCHAR(32)
);
CREATE TABLE assigned_tasks
(
  member_id int, 
  task_id int,
  PRIMARY KEY (member_id, task_id),
  FOREIGN KEY (member_id) REFERENCES members (member_id),
  FOREIGN KEY (task_id)   REFERENCES tasks (task_id)
);

现在,如果您需要一个带有每个用户的分隔任务列表的表示,您可以使用 GROUP_CONCAT()GROUP BY

SELECT m.member_id, m.member_name, GROUP_CONCAT(t.task_name) tasks
  FROM assigned_tasks a JOIN members m
    ON a.member_id = m.member_id JOIN tasks t
    ON a.task_id = t.task_id
 GROUP BY m.member_id, m.member_name

输出:

|会员ID |会员名 |任务 | |-----------|-------------|------------------| | 1 |演示用户 |建模、测绘 |

这里是SQLFiddle演示

【讨论】:

  • 谢谢!我现在明白了。我成功地在另一边得到了这样的结果:sqlfiddle.com/#!2/ba087d/5 谢谢。
  • 根据您的业务需求,您可能需要查看assigned_tasks 表的变体。如果可以为成员分配任务一段时间,然后解除该任务,然后重新分配,那么您的数据模型必须能够处理它。
  • 再次感谢您!现在我创建了我的“分配”表,我的数据库中有 22 个表。我认为我们可以用一张表来简化它,这会给我其他表之间的关系?这是我的数据库:pastebin.com/7KRnz3zj
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 2017-04-21
  • 2016-11-11
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多