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,它没有。我以前试过,但只有当所有三个表中都有记录时,它才起作用,否则它不会删除任何记录……对不起,没有回答这个问题。我已经更新了答案让它生效。没错。。。我正在使用左连接,它现在可以正常工作。。。谢谢你的回答。。