Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 如何修复此删除查询?_Mysql - Fatal编程技术网

Mysql 如何修复此删除查询?

Mysql 如何修复此删除查询?,mysql,Mysql,我有两张表:productsproduct\u id,date和sexproduct\u id,sex 我想从products表中删除所有具有product_id的产品,该产品在sex表中存在一行,并且该product_id和sex=1 我还希望从sex表中删除我要从products表中删除的一行中包含product_id的所有行。这可能会删除每个产品标识的多行 到目前为止我有 DECLARE @recordsToDelete AS TABLE( int product_id ); INSER

我有两张表:productsproduct\u id,date和sexproduct\u id,sex

我想从products表中删除所有具有product_id的产品,该产品在sex表中存在一行,并且该product_id和sex=1

我还希望从sex表中删除我要从products表中删除的一行中包含product_id的所有行。这可能会删除每个产品标识的多行

到目前为止我有

DECLARE @recordsToDelete AS TABLE(
int product_id
);

INSERT INTO @recordsToDelete( product_id )
SELECT product_id 
FROM products p
   JOIN sex s
     ON p.product_id = s.product_id
WHERE s.sex = 1;
然后,我将使用

SELECT * FROM @recordsToDelete;
执行前

DELETE FROM products 
WHERE product_id IN ( SELECT product_id FROM @recordsToDelete );

DELETE FROM sex
WHERE product_id IN ( SELECT product_id FROM @recordsToDelete );
但是DECLARE语句给了我一个语法错误。我注意到DECLARE需要一个BEGIN/END复合语句,但我无法正确地表达它。我怎样才能改正我的错误

编辑:

固定通孔

CREATE TEMPORARY TABLE recordsToDelete(
product_id INT
);# MySQL returned an empty result set (i.e. zero rows).
INSERT INTO recordsToDelete( product_id ) 
SELECT p.product_id
FROM products p
JOIN sex s ON p.product_id = s.product_id
WHERE s.sex =1;# Affected rows: 275
SELECT * 
FROM recordsToDelete;

我认为您正在寻找创建临时表来创建表,而不是声明

有关在MySQL中创建表的更多信息,请参阅


您使用的语法似乎适用于MS SQL server,而不是MySQL。在MySQL中,用于局部变量、条件、处理程序和游标,但不用于创建表。

我认为您正在寻找创建临时表来创建表,而不是声明

有关在MySQL中创建表的更多信息,请参阅

您使用的语法似乎适用于MS SQL server,而不是MySQL。在MySQL中,用于局部变量、条件、处理程序和游标,但不用于创建表。

试试这个

CREATE TEMPORARY TABLE tempTable
      SELECT product_id  
        FROM products AS p
  INNER JOIN sex AS s
          ON p.product_id = s.product_id 
       WHERE s.sex = 1;

 DELETE FROM products AS p
NATURAL JOIN tempTable AS t
       WHERE p.product_id = t.product_id;
顺便说一句,您不能从同一个表中删除,请从同一个表中选择*

我引述: 当前,不能从表中删除,也不能从子查询中的同一表中选择

试试这个

CREATE TEMPORARY TABLE tempTable
      SELECT product_id  
        FROM products AS p
  INNER JOIN sex AS s
          ON p.product_id = s.product_id 
       WHERE s.sex = 1;

 DELETE FROM products AS p
NATURAL JOIN tempTable AS t
       WHERE p.product_id = t.product_id;
顺便说一句,您不能从同一个表中删除,请从同一个表中选择*

我引述: 当前,不能从表中删除,也不能从子查询中的同一表中选择


我认为您可以通过简单的多任务删除获得所需:

delete sex, products from products p 
inner join sex s on p.id=s.product_id
where s.sex=1

您还可以考虑在表上使用级联删除:


我认为您可以通过简单的多任务删除获得所需:

delete sex, products from products p 
inner join sex s on p.id=s.product_id
where s.sex=1

您还可以考虑在表上使用级联删除:


谢谢,我还没有真正执行删除操作,所以我没有意识到这个问题。我想知道使用自然连接和内部连接的目的是什么。文档建议自然联接是使用两个表中存在的所有列的内部联接。如果是这样,那么在使用自然连接时是否需要使用WHERE子句?@jela NATURAL JOIN是一种速记方法,请注意,当两个表都有相同的列名时,即product_id在两个表中都是相同的名称时,缺少ON子句,以便MySQL能够找到答案。那么是否可以从DELETE查询中删除WHERE子句,因为自然连接将自动连接两个表中的product_id列?否!!!在您的例子中,WHERE子句仅在p.product_id&t.product_id上的temp表中存在匹配项的情况下才从products表中删除。如果删除WHERE子句,您的意思是从联接表中删除所有记录,那么整个products表将消失。但是联接表是否只包含如果条件已经满足,那么自然连接会自动连接到产品id上?当然,我还没有真正尝试过这个,因为我意识到我不理解一些东西。我不明白为什么查询不能被写为DELETE FROM products,因为p.product\u id=t.product\u id上的p internal JOIN可诱惑为t,或者,如果可以,为什么这与p NATURAL JOIN Attentiable as t从产品中删除不同,因为Attentiable只包含product_id值,其在products表中的行应该被删除。谢谢,我还没有实际执行删除,所以我没有意识到这个问题。我想知道使用自然连接和内部连接的目的是什么。文档建议自然联接是使用两个表中存在的所有列的内部联接。如果是这样,那么在使用自然连接时是否需要使用WHERE子句?@jela NATURAL JOIN是一种速记方法,请注意,当两个表都有相同的列名时,即product_id在两个表中都是相同的名称时,缺少ON子句,以便MySQL能够找到答案。那么是否可以从DELETE查询中删除WHERE子句,因为自然连接将自动连接两个表中的product_id列?否!!!在您的例子中,WHERE子句仅在p.product_id&t.product_id上的temp表中存在匹配项的情况下才从products表中删除。如果删除WHERE子句,您的意思是从联接表中删除所有记录,那么整个products表将消失。但是联接表是否只包含如果条件已经满足,那么自然连接会自动连接到产品id上?当然,我还没有真正尝试过这个,因为我意识到我不理解一些东西。我不明白为什么查询不能被写,从产品中删除,作为p内部连接,作为p上的t product_id=t.product_id,或者,如果可以的话,为什么这与从products中删除p NATURAL JOIN Attentiable as t不同,因为Attentiable只包含product_id值,products表中的行应该被删除。