2015-03-30 28 views
0

看看下面的數據集:MySQL - 有沒有辦法保持我的數據集的參照完整性?

Users 
(int) (varchar)  (varchar)  (varchar) 
id | username | password | stuff | 
1   john   cat   stuff 
2   jack   dog   stuff 
3   bill   bird   stuff 
. 
. 
. 
n   userN   lol   stuff 

Colors 
(int)   (varchar) 
userid  | color 
1    green 
2    green 
3    yellow 
.    . 
.    . 
.    . 
n    purple 

現在我們明顯可以看到的顏色和用戶由用戶標識鏈接。我們正確的用戶刪除腳本將從顏色表中刪除所有匹配的用戶標識,然後刪除用戶表中的用戶。比方說,我們有一個懶惰的管理員,他們手動將SSH登錄到服務器並從用戶表中刪除用戶。假設「約翰」已被刪除。

然後我們有一個問題,當我們的顏色檢索腳本運行(PHP爲簡單起見):

<? 
$query = "SELECT * FROM colors WHERE color = 'green'"; 
$result = mysql_query($query); 

while ($row = mysql_fetch_asoc($result)) { 
    //The code bricks here. 
    $query2 = "SELECT * FROM users WHERE id = " . $row['id']. " LIMIT 1"; 
    $result2 = mysql_query($query2); 
    $row2 = mysql_fetch_asoc($result2); 
    echo $row2['username'] . "<br />" 
} 

?> 

有沒有在MySQL本身就是一個概念,也不會允許管理員刪除用戶表,如果該條目該用戶標識位於顏色表中。請原諒我的無知,我不是DBA。

+0

另一方面,如果你想向DBA提出問題,那麼就有[Stack Exchange](http://dba.stackexchange.com)。 – xathien 2015-03-30 20:37:36

回答

0

你想要的是FOREIGN KEY s與ON DELETE CASCADEFOREIGN KEY約束將要求Colors表上的userid引用另一個表上的值。閱讀它們here

在創建表時,可以這樣定義密鑰:

CREATE TABLE users (
    id BIGINT, 
    (other columns etc) 
); 

CREATE TABLE colors (
    userid BIGINT, 
    (other columns etc), 
    FOREIGN KEY `userid_fk` (`userid`) REFERENCES users(`id`) ON DELETE CASCADE 
); 

什麼該行表示:你想對userid列命名爲userid_fk的外鍵。 userid列中的任何值必須存在於users表的id列中。有了這個,即使有人刪除了users行,刪除將會是CASCADE,這意味着它也會刪除colors表中的所有相關行。