MySQL - 有没有办法保持我的数据集的参照完整性?
MySQL - Is there a way to preserve referential integrity of my data set?
取如下数据集:
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
现在我们显然可以看到颜色和用户是通过userid关联起来的。我们正确的用户删除脚本会从颜色 table 中删除所有匹配的用户 ID,然后删除用户 table 中的用户。假设我们有一个懒惰的管理员,他手动通过 SSH 连接到服务器并从用户 table 中删除了一个用户。假设 "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 />"
}
?>
MySQL 本身是否有一个概念不允许管理员删除用户 table 中的条目,如果该用户 ID 是颜色 table。原谅我的无知,我不是DBA。
你想要的是 FOREIGN KEY
和 ON DELETE CASCADE
。 FOREIGN KEY
约束将要求 Colors
table 上的 userid
引用另一个 table 上的值。仔细阅读它们 here。
创建 table 时,您可以像这样指定密钥:
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
table 的 id
列中。有了这个,即使有人删除了 users
行,删除也会 CASCADE
,这意味着它也会删除 colors
table.
上的所有相关行
取如下数据集:
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
现在我们显然可以看到颜色和用户是通过userid关联起来的。我们正确的用户删除脚本会从颜色 table 中删除所有匹配的用户 ID,然后删除用户 table 中的用户。假设我们有一个懒惰的管理员,他手动通过 SSH 连接到服务器并从用户 table 中删除了一个用户。假设 "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 />"
}
?>
MySQL 本身是否有一个概念不允许管理员删除用户 table 中的条目,如果该用户 ID 是颜色 table。原谅我的无知,我不是DBA。
你想要的是 FOREIGN KEY
和 ON DELETE CASCADE
。 FOREIGN KEY
约束将要求 Colors
table 上的 userid
引用另一个 table 上的值。仔细阅读它们 here。
创建 table 时,您可以像这样指定密钥:
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
table 的 id
列中。有了这个,即使有人删除了 users
行,删除也会 CASCADE
,这意味着它也会删除 colors
table.