MySQL - 有没有办法保护我的数据集的参照完整性?

时间:2015-03-30 19:56:56

标签: php mysql database-administration referential-integrity

采取以下数据集:

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

现在我们显然可以看到颜色和用户是由用户ID链接的。我们正确的用户删除脚本将从colors表中删除所有匹配的用户ID,然后删除users表中的用户。假设我们有一个懒惰的管理员手动SSH到服务器并从users表中删除用户。让我们假设" john"被删除了。

当我们的颜色检索脚本运行时(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 />"
}

?>

如果该用户标识在colors表中,那么MySQL本身是否有一个概念不允许管理员删除users表中的条目。请原谅我的无知,我不是DBA。

1 个答案:

答案 0 :(得分:0)

FOREIGN KEYON DELETE CASCADE FOREIGN KEY的关联。 userid约束将要求Colors表上的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 ); 引用另一个表上的值。阅读它们here

创建表格时,您可以像这样指定密钥:

userid_fk

该行表示:您需要userid列上名为userid的外键。 users列中的任何值都必须存在于id表的users列中。有了这个,即使有人删除CASCADE行,删除也会colors,这意味着它也会删除{{1}}表上的所有相关行。