MySQL 中 0..1:1..n 表的 SQL 自动清理

发布于 2024-11-09 04:22:11 字数 595 浏览 0 评论 0原文

我正在编写一个应用程序,要求所有用户使用 MySQL 访问中央数据库上的数据,我想知道一些事情。

假设我有这个设置。

CREATE TABLE A
(
    id   INT PRIMARY KEY AUTO_INCREMENT,
    data INT NOT NULL;
);

CREATE TABLE B
(
   id    INT PRIMARY KEY AUTO_INCREMENT,
   a_id  INT,
   FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE SET NULL
);

现在,我希望这种设置的方式是,表 A 必须始终由表 B 中的行引用。但是,表 B 中的行可能会也可能不会引用表 A 中的行。关系是 1:n表 B 中的多行可以引用表 A 中的单行。我只是想知道如果 A 中的行不再被表 B 中的任何行引用,是否可以让 MySQL 数据库自动删除该行。

这里的想法是我可以简单地在表中设置 a_id B 为 NULL 并让数据库清理剩下的任何内容。现在想起来,我想这与 Java 垃圾收集类似。如果没有自动执行约束的键,更新后执行的触发器会起作用吗?

编辑:添加附加关系约束。

I'm writing an application that requires all users to access data on a central database using MySQL, and I was wondering something.

Let's say I have this setup.

CREATE TABLE A
(
    id   INT PRIMARY KEY AUTO_INCREMENT,
    data INT NOT NULL;
);

CREATE TABLE B
(
   id    INT PRIMARY KEY AUTO_INCREMENT,
   a_id  INT,
   FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE SET NULL
);

Now, the way I want this set up is, table A must ALWAYS be referenced by a row in table B. However, a row in table B may or may not reference a row in table A. The relationship is 1:n in that multiple rows in table B can reference a single row in table A. I am just wondering if it is possible to have the MySQL database automatically delete a row in A if it is no longer referenced by any row in table B.

The idea here is that I can simply set a_id in table B to NULL and have the database cleanup whatever is left. I guess that's similar to Java garbage collection now that I think about it. If there is no key to automatically enforce the constraint, would a trigger executed after an update work?

EDIT: Adding in the additional relationship constraint.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

捎一片雪花 2024-11-16 04:22:11

以特定时间间隔运行以下查询:

DELETE tableA
FROM tableA LEFT JOIN tableB B ON A.id = B.a_id
WHERE B.a_id IS NULL;

或者,为了保持实时一致性,您可以在 tableB 上创建执行类似操作的 OnChange 触发器。

Run the following query at a specific interval:

DELETE tableA
FROM tableA LEFT JOIN tableB B ON A.id = B.a_id
WHERE B.a_id IS NULL;

Or, to maintain real-time consistency, you could create an OnChange trigger on tableB that performs similar.

南城追梦 2024-11-16 04:22:11

您使用的表结构有什么原因吗?您使用外键的方式在我看来是倒退的。您可以将密钥移至表 A,而不是将其放在表 B 中。

这会给您一个看起来更像是的结构:

tableA columns        tableB columns
  id
  b_id                id
  [values]            [values]

  fk: a.b_id=b.id

添加到表 A 的记录需要表 B 中的相应字段,但 B 可以自由地拥有表 A 中没有值。那么如果您想清除表 A 中的值,您可以简单地使用:

delete from tableA where b_id=[recordIdToNull];

您甚至可以将 A 的外键设置为对 B 执行的级联操作,因此从 B 中删除的任何值也会删除相应的值A 中的行。

Is there a reason for the table structure you are using? The way you are using foreign keys looks backwards to me. Instead of placing your key in table B, you could move it to table A.

This would give you a structure that looked more like:

tableA columns        tableB columns
  id
  b_id                id
  [values]            [values]

  fk: a.b_id=b.id

A record added to table A would require a corresponding field in table B, but B would be free to have no values in table A. Then if you wanted to clean out the values in table A, you could simply use:

delete from tableA where b_id=[recordIdToNull];

You could even set A's foreign key up to cascade actions taken on B, so any values deleted from B would also delete the corresponding rows in A.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文