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 KEYON DELETE CASCADEFOREIGN 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.

上的所有相关行