MySQL:带有值列表的自动列更新

时间:2013-11-03 12:20:44

标签: mysql sql indexing foreign-keys

我只想自动更新与外键链接的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),但我只是成功在列中插入一个值,而另一个表未自动更新...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

永远不要在数据库中存储分隔值。通过创建多对多表(在您的情况下,让我们称之为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

输出:

| MEMBER_ID | MEMBER_NAME |            TASKS |
|-----------|-------------|------------------|
|         1 |   Demo User | Modeling,Mapping |

这是 SQLFiddle 演示