2013-11-03 115 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表的變體。如果一個成員可以分配一個任務一段時間,然後解除該任務,然後重新分配它,那麼您的數據模型必須能夠處理它。 –