2010-01-05 169 views
1

我很犹豫要运行此查询删除数据(显而易见的原因)。从两个表中删除数据,基于第三个ID

我想从两个表中,删除匹配的行,其中所述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 

为了测试这一点,我想运行一个选择与SELECT * FROM更换DELETE FROM,我得到一个语法错误“附近使用”。当我删除USING ...时,它会选择表中的每一行(忽略client_id=1子句)。

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

该查询是否有效?

+1

您是否尝试过在你的测试数据库运行呢?你确实有一个,对吧? – 2010-01-05 21:52:24

+0

恐怕不是 - 我(就目前而言)是一名短期合同员工,这是一个巨大的数据库。 – 2010-01-05 21:55:05

+0

我会建议这= = – 2010-01-05 21:55:58

回答

2

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

+0

交易是完全陌生的我...我会研究这一点。 – 2010-01-05 21:59:25

+0

Derek,关于测试服务器,您可以随时在PC上创建表格,插入一些假数据,运行查询并检查结果是否符合要求......确保您插入其他ID而不是client_id = 1,课程 – Clash 2010-01-05 22:06:48

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'之类的东西。

+0

该语法在MySQL中有效。但是,即使使用OP中的语法,如果基础表是MyISAM表,语句也不会自动运行。所以,尽管它的一个声明并不是自动的 - 你需要InnoDB表格。 – 2010-01-05 22:01:10

+0

@罗兰:哼。不知道。我必须去阅读它。整齐。但是,混合的InnoDB/MyISAM表使得事情变得安全。这就是我无意中从生产表中删除数据的原因(它是MyISAM中的3个中的3个中的一个),并且必须从备份中获取数据。 – MBCook 2010-01-06 16:33:06

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; 

假设我理解你的模式是正确的。删除Purchase引用的Transaction似乎有点不同寻常,因为这当然会成为一对多的关系。是否有UNIQUE限制以确保它是一对一的?如果没有,你能确定没有其他Purchase将引用删除Transaction

您可以测试上述构建一个SELECT简单:

SELECT Purchase.Purchase_ID, `Transaction`.Transaction_ID 
FROM Item ... 
相关问题