根据第三个ID删除两个表中的数据

时间:2010-01-05 21:50:10

标签: mysql

我犹豫是否要运行这个删除数据的查询(原因很明显)。

我想从两个表中删除匹配的行,其中ID =第三个表的ID(我想保持不受影响)

这是我想要运行的确切查询:

DELETE FROM ItemTracker_dbo.Transaction t, 
            ItemTracker_dbo.Purchase p
USING ItemTracker_dbo.Transaction
INNER JOIN ItemTracer_dbo.Purchase ON p.Transaction_ID = t.Transaction_ID
INNER JOIN ItemTracker_dbo.Item i ON i.Item_ID = p.Item_ID
WHERE i.Client_ID = 1

为了对此进行测试,我尝试使用DELETE FROM运行选择替换SELECT * FROM,并且在“USING”附近出现语法错误。当我删除USING ...时,它会选择表中的每一行(忽略client_id=1子句)。

我(基本上)从mysql manual复制语法(显然替换了值)。

此查询有效吗?

3 个答案:

答案 0 :(得分:2)

对不起,我没有发表评论而非发帖,但我的名声不够。为什么不将它作为交易运行并查看结果?或者我错过了什么? http://dev.mysql.com/doc/refman/5.0/en/commit.html

答案 1 :(得分:2)

据我所知,你不能这样做。通过交易来实现的方式。

START TRANSACTION;

DELETE FROM tableOne WHERE criteria;

DELETE FROM tableTwo WHERE criteria;

COMMIT;

如果语句之间出现问题,您可以发出ROLLBACK并且您的数据将在那里。

问题是,这将不适用于MyISAM 。 MyISAM不支持事务,因此它只是删除数据而无法回滚。他们需要是InnoDB表。它默默地这样做。我已经丢失了一个生产表(好东西,我有一个备份,它没有更新)。

最简单的方法来确定表是否是InnoDB?

SHOW CREATE TABLE tableName;

最后,它会有'Engine = InnoDB'或'Engine = MyISAM'。

答案 2 :(得分:0)

我不熟悉这个(非标准?)使用USING来连接上面的表,但是如果你只是想从连接中的某些表中删除行,那么正常的方式将是:

DELETE Purchase, `Transaction`
FROM Item
JOIN Purchase ON Purchase.Item_ID=Item.Item_ID
JOIN `Transaction` ON `Transaction`.Transaction_ID=Purchase.Transaction_ID
WHERE Item.Client_ID=1;

假设我理解你的架构是正确的。删除Transaction引用的Purchase似乎有点不寻常,因为这自然会有很多 - Purchase s-to-one - Transaction关系。是否存在UNIQUE约束以确保它是一对一的?如果没有,您能确定没有其他Purchase会引用已删除的Transaction吗?

您可以简单地将上述构造作为SELECT进行测试:

SELECT Purchase.Purchase_ID, `Transaction`.Transaction_ID
FROM Item ...