【问题标题】:MySQL - Is there a way to preserve referential integrity of my data set?MySQL - 有没有办法保持我的数据集的引用完整性?
【发布时间】:2026-01-09 19:45:02
【问题描述】:

取以下数据集:

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 链接的。我们正确的用户删除脚本会从颜色表中删除所有匹配的用户 ID,然后删除用户表中的用户。假设我们有一个懒惰的管理员,他手动 SSH 到服务器并从用户表中删除一个用户。假设“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 />"
}

?>

如果用户 ID 在颜色表中,MySQL 本身是否存在不允许管理员删除用户表中的条目的概念。原谅我的无知,我不是DBA。

【问题讨论】:

  • 附带说明,如果您想向 DBA 提出问题,可以使用 a Stack Exchange

标签: php mysql database-administration referential-integrity


【解决方案1】:

你想要的是FOREIGN KEYs 和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 表上的所有相关行。

【讨论】:

    最近更新 更多