Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中0..1:1..n表的SQL自动清理_Mysql_Sql_Resource Cleanup - Fatal编程技术网

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

MySQL中0..1:1..n表的SQL自动清理,mysql,sql,resource-cleanup,Mysql,Sql,Resource Cleanup,我正在编写一个应用程序,要求所有用户使用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)

我正在编写一个应用程序,要求所有用户使用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中的一行,也可能不引用表a中的一行。关系为1:n,因为表B中的多行可以引用表a中的一行。我只是想知道,如果表B中的任何行都不再引用a中的一行,MySQL数据库是否可以自动删除该行

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


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

使用表结构是否有原因?你使用外键的方式让我回头看。您可以将密钥移动到表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中相应的行。

您使用的表结构有什么原因吗?你使用外键的方式让我回头看。您可以将密钥移动到表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中相应的行。

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

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

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

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

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

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

我可以看出,如果关系为1:1,这会有多大帮助。我忘了提到这是一个1:n关系,其中tableB中的许多行可以引用tableA中的一行。如果我把外键放在表a中,那就意味着我需要表a中的每一个引用都有一行,对吗?我明白你现在想问什么了。如果您查看mysql手册中的删除内容,您实际上可以使用NGLN编写的delete语句,只需进行一次修改—您必须在删除开始时指定目标表(即从TableA left join中删除TableA…)。我可以看出,如果关系为1:1,这将有多大帮助。我忘了提到这是一个1:n关系,其中tableB中的许多行可以引用tableA中的一行。如果我把外键放在表a中,那就意味着我需要表a中的每一个引用都有一行,对吗?我明白你现在想问什么了。如果您查看mysql手册中的删除内容,您实际上可以使用NGLN编写的delete语句,只需进行一次修改-您必须在删除开始时指定目标表(即从TableA left join中删除TableA…),我认为这在其他数据库中也可以使用,但是MySQL不允许您更新正在使用SELECT的表。每次运行此命令时,都会出现错误“您不能在FROM子句中指定更新的目标表'tablea'。嵌套的SELECT语句似乎是罪魁祸首。我也许可以通过解剖它来弄清楚该怎么做。谢谢。我想这可以在其他数据库中使用,但MySQL不允许您更新正在使用SELECT的表。每次运行此命令时,都会出现错误“您不能在FROM子句中指定更新的目标表'tablea'。嵌套的SELECT语句似乎是罪魁祸首。我也许可以通过解剖它来弄清楚该怎么做。谢谢。那么,您想实现一个
1::1..n
关系,对吗?也许您应该把它放在标题中。我认为在MySQL中这并不容易。既然你说“表B中的一行可能引用表a中的一行,也可能不引用表a中的一行”,那么这个关系就相当于
0..1::1..n
了,这个问题变得非常挑剔,但我想你是对的。我之所以发表评论,首先是因为它不是通常被称为
1:n
的普通
1::0..n
,其次是因为与普通的两个点的偏离使得处理起来更加困难,特别是在MySQL中。如何确保正确的插入和删除是有困难的。因此,您希望实现一个
1::1..n
关系,对吗?也许您应该将其放在标题中。我认为在MySQL中这并不容易。既然你说“表B中的一行可能引用表a中的一行,也可能不引用表a中的一行”,那么这个关系就相当于
0..1::1..n
了,这个问题变得非常挑剔,但我想你是对的。我之所以发表评论,首先是因为它不是通常被称为
1:n
的普通
1::0..n
,其次是因为与普通的两个点的偏离使得处理起来更加困难,特别是在MySQL中。如何确保正确的插入和删除存在困难。