2009-07-05 57 views
0

我有一個表:刪除一行在MySQL

 
NACHRICHT_ID | VERFASSER_USERNAME | BETREFF | TEXT | DATUM | EMPAENGER_ID 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-01| 
    1  |   h   | hfgh | hfgh | 23:15:10 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    3  |   h   | hfgh | hfgh | 00:30:10 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    4  |   q   | hfgh | hi | 11:42:06 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    5  |   h   | hfgh | hfgh | 12:53:56 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    6  |   h   | hfgh | hfgh | 13:19:53 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    7  |   h   | hfgh | hfgh | 13:20:18 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    8  |   mkd  | hfgh | hfgh | 13:47:32 | 31 
------------------------------------------------------------------------------ 
      |     |   |  | 2009-07-02| 
    9  |   h   | hfgh | hfgh | 16:42:10 | 31 
------------------------------------------------------------------------------ 

我試圖刪除的行那裏NACHRICHT_ID = 3

DELETE FROM NACHRICHTEN JOIN 
        NACHRICHTEN_EMPFAENGER_MAP USING (NACHRICHT_ID) 
        WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3 ; 

但它無法正常工作。我究竟做錯了什麼?

+2

@darkrain - 請解釋當你說「刪除會在聯接後發生」時你的意思。它一點都不清楚。 – 2009-07-05 20:31:12

+0

您可能試圖刪除發送給特定收件人的所有新聞項目嗎? – feihtthief 2009-07-05 21:35:24

回答

2
DELETE FROM 'table' WHERE NACHRICHT_ID = 3 
1
DELETE FROM NACHRICHTEN 
WHERE EMPFAENGER_ID = 31 && NACHRICHT_ID = 3; 
2

聯接是創建基於其他幾個表數據的臨時表,然後從這個臨時表中檢索值的操作,然後將其丟棄(這是這個概念,而不是實際的實現)。

因此刪除「來自」或「加入之後」是一個沒有多大意義的想法。但是如果我沒有正確使用,你只是想刪除信息(Nachricht)。您應該從消息表中刪除此消息,如其他答案中所示。

之後,如果你做了你的SELECT * FROM ... JOIN ...,你會發現消息不在加入結果中。

我希望有幫助。

PS:沒有必要大吼那些試圖幫助你的人。

2

我猜你正在使用MyISAM作爲你的存儲引擎,不幸的是它不支持外鍵。

因此,考慮下表:

A 
--- 
A_ID (PK), A_SOMETHING 

B 
--- 
B_ID (PK), B_SOMETHING 

C 
--- 
A_ID (PK, FK), B_ID (PK, FK) 

如果你想刪除這些鏈接到B_ID = 13的所有作爲,你可以做到以下幾點。

DELETE FORM A WHERE A_ID IN (SELECT A_ID FROM C WHERE B_ID = 13); 

或者,如果你想刪除所有作爲其中的鏈接B的B_SOMETHING值是 '富':

DELETE FORM A WHERE A_ID IN 
    (SELECT C.A_ID FROM B,C 
     WHERE B.B_ID = C.B_ID 
      AND B.B_SOMETHING = 'Foo' 
    ); 

後,你必須做些清除工作:

DELETE FROM C WHERE A_ID NOT IN (SELECT A_ID FROM A); 

現在,手動完成這一切是一件痛苦的事情,您最好使用支持外鍵的存儲引擎(InnoDB)。

您應該提供所有相關表格的屏幕截圖,而不僅僅是連接的結果。它會讓你的問題更加清晰。

5

你的問題不清楚。

你有3個表:

  • 新聞報=新聞項目
  • NACHRICHTEN_EMPFAENGER_MAP =新聞條目到收件人地圖
  • EMPFAENGER(我猜的名字)=收件人

你想要刪除新聞項目?那麼這樣做:如果你想刪除的實際

delete from NACHRICHTEN_EMPFAENGER_MAP where NACHRICHT_ID=3 and EMPFAENGER_ID=31; 

delete from NACHRICHTEN where NACHRICHT_ID = 3; 

如果你想刪除的新聞條目之間的id爲3和id爲31收件人的映射,然後執行此如果你想做些別的事情,問的問題與更多細節請id爲31收件人,然後做到這一點(假設表被稱爲EMPFAENGER)

delete from EMPFAENGER where EMPFAENGER_ID = 31;