2010-01-05 170 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 ... 
相關問題