采取以下数据集:
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。
答案 0 :(得分:0)
FOREIGN KEY
与ON 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}}表上的所有相关行。