我犹豫是否要运行这个删除数据的查询(原因很明显)。
我想从两个表中删除匹配的行,其中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复制语法(显然替换了值)。
此查询有效吗?
答案 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 ...