2013-11-03 119 views
0

我只是想自动更新与外键链接的2个列的列。 更多的,这些列不得不包含一个值,而是一个值列表。MySQL:自动列更新与值列表

这是我的例子:

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

我知道你的意思,但你不认为为每个成员或任务创建表会创建一个巨大的数据库,这可能会变得不稳定? – mickaelb91

+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 demo

+0

谢谢!我现在明白了。我成功地在另一方面得到了这样的结果:http://sqlfiddle.com/#!2/ba087d/5谢谢。 – mickaelb91

+0

非常欢迎:)祝你好运。 – peterm

+0

根据您的业务需求,您可能需要查看assigned_tasks表的变体。如果一个成员可以分配一个任务一段时间,然后解除该任务,然后重新分配它,那么您的数据模型必须能够处理它。 –