Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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_Sql - Fatal编程技术网

Mysql 从多个表中删除行

Mysql 从多个表中删除行,mysql,sql,Mysql,Sql,我想从多个表中删除行,我该怎么做? 我试过了 DELETE a.*, b.*, c.* FROM table1 as a, table2 as b, table3 as c WHERE a.colName = 'value' AND b.colName = 'value' AND a.c.colName = 'value'; 'value'对于所有表以及colName都是相同的 对于此查询,所有表中都必须存在记录,但在我的情况下,表中可能存在记录,也可能不存在记录。 当我们运行删除查询时,它会

我想从多个表中删除行,我该怎么做? 我试过了

DELETE a.*, b.*, c.*
FROM table1 as a, table2 as b, table3 as c
WHERE a.colName = 'value'
AND b.colName = 'value'
AND a.c.colName = 'value';
'value'
对于所有表以及
colName
都是相同的

对于此查询,所有表中都必须存在记录,但在我的情况下,表中可能存在记录,也可能不存在记录。 当我们运行删除查询时,它会删除现有记录,否则返回
'0行受影响的'
。所以我只想运行3个这样的查询

DELETE FROM table1 WHERE colName = 'value';
DELETE FROM table1 WHERE colName = 'value';
DELETE FROM table1 WHERE colName = 'value';
在一个查询中


谢谢

,因为您的实际问题是同时执行多个查询。最好的解决方案是集成mysqli扩展并与以下查询一起使用:

DELETE FROM table1 WHERE colName = 'value';
DELETE FROM table2 WHERE colName = 'value';
DELETE FROM table3 WHERE colName = 'value';

使用连接删除在mysql中有点奇怪。你需要这样的东西:

编辑:

允许所有表上不存在的行

DELETE FROM 
  table1, table2, table3
USING 
  table1 
LEFT JOIN 
  table2 ON table2.colName = table1.colName 
LEFT JOIN 
  table3 ON table3.colName = table1.colName 
WHERE 
  table1.colName = 'value'

我建议设置一个收集所有行的视图,然后从该视图中删除

CREATE VIEW v AS
SELECT colName FROM a
UNION ALL
SELECT colName FROM b
UNION ALL
SELECT colName FROM c
然后

DELETE FROM v
WHERE colName = 'value'

考虑以下几点

DROP TABLE IF EXISTS table1;

CREATE TABLE table1
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,colname CHAR(1) NOT NULL
);

DROP TABLE IF EXISTS table2;

CREATE TABLE table2
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,colname CHAR(1) NOT NULL
);

DROP TABLE IF EXISTS table3;

CREATE TABLE table3
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,colname CHAR(1) NOT NULL
);

INSERT INTO table1 (colname) VALUES ('x'),('y'),('z');

INSERT INTO table2 (colname) VALUES ('x'),('x'),('z');

INSERT INTO table3 (colname) VALUES ('y'),('y'),('z');

SELECT * FROM table1;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | x       |
  |  2 | y       |
  |  3 | z       |
  +----+---------+

SELECT * FROM table2;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | x       |
  |  2 | x       |
  |  3 | z       |
  +----+---------+

SELECT * FROM table3;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | y       |
  |  2 | y       |
  |  3 | z       |
  +----+---------+

DELETE a, b, c
  FROM table1 a
  JOIN table2 b
    ON b.colname = a.colname
  JOIN table3 c
    ON c.colname = a.colname
 WHERE a.colName IN('x','z');

SELECT * FROM table1;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | x       |
  |  2 | y       |
  +----+---------+

SELECT * FROM table2;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | x       |
  |  2 | x       |
  +----+---------+

SELECT * FROM table3;
  +----+---------+
  | id | colname |
  +----+---------+
  |  1 | y       |
  |  2 | y       |
  +----+---------+ 

正如mikea所演示的,您可以用内部联接替换外部联接,以完全删除“x”值,尽管它们不在表3中。您可以对每个表执行一次删除操作。这样做的好处是什么?您的3行示例更短,更易于调试。另一方面,单个delete语句会毫无理由地生成一个巨大的连接。(您失败的原因是它是一个内部连接,但我也不建议将其转换为外部连接。)我正在调用一个PHP服务来删除这些记录,因此如果我在一个查询字符串中发送多个查询,它将不起作用,因为PHP服务调用
mysql\u query($query,$link)
mysql\u query()出于安全原因,无法执行多个语句…我明白了。你能试试
而不是
吗?阿里,我可能会发布一个有效的解决方案,但与此同时,也可以看看DELETENo上的CASCADE,它没有。我以前试过,但只有当所有三个表中都有记录时,它才起作用,否则它不会删除任何记录……对不起,没有回答这个问题。我已经更新了答案让它生效。没错。。。我正在使用左连接,它现在可以正常工作。。。谢谢你的回答。。