1

我正在编写一个应用程序,它要求所有用户使用 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 中的单行。我只是想知道如果表 B 中的任何行不再引用 A 中的一行,MySQL 数据库是否可以自动删除该行。

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

编辑:添加额外的关系约束。

4

2 回答 2

1

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

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

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

于 2011-05-24T19:58:35.257 回答
0

您使用的表结构是否有原因?你使用外键的方式在我看来是倒退的。您可以将其移至表 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 中的相应行。

于 2011-05-24T19:11:55.380 回答