2011-04-21 76 views
3

我有4個表格:用戶,消息,文件,筆記。我想做一個查詢,刪除所有用戶的內容。將以下工作:這是一個有效的MySQL查詢?

DELETE FROM users, messages, files, notes WHERE userId = '$userId' 

所有4臺已經拿到了列userId

+0

你說「以下工作?」你爲什麼不先試試自己? – 2011-04-21 14:52:13

+0

@Naveed我在這個網站上的任何地方都沒有看到任何規則,當我提出問題時,您會被徵稅。 – 2011-04-21 14:54:54

回答

5

可以在拆分的聲明四個單獨的語句,以刪除與該用戶ID相關聯的行。

DELETE FROM users WHERE userId = '$userId' 
DELETE FROM messages WHERE userId = '$userId' 
DELETE FROM files WHERE userId = '$userId' 
DELETE FROM notes WHERE userId = '$userId' 

另一種替代方法是在外鍵之間級聯刪除。

創建外鍵時,您可以選擇想要對子記錄進行刪除父記錄的操作。這通過在創建外鍵時指定ON Delete來表示。下面是在WHERE語句有一定的參考http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY 
    [index_name] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name,...) 
    [ON DELETE reference_option] 
    [ON UPDATE reference_option] 
1

,如果你有一個以上的表引用,你應該參考TABLE.COLUMN, 如:WHERE users.userid = '$userId'. 我建議做每桌1句

-1
+0

否。鏈接到的文檔表明,從多個表中刪除時必須使用USING子句。 – 2011-04-21 14:53:53

+0

ERR .. no..Multiple表語法: 刪除[LOW_PRIORITY] [QUICK] [忽略] tbl_name [*] [,tbl_name [*]] ... FROM table_references [WHERE where_condition] – ethrbunny 2011-04-22 14:32:22

+0

@ethrbunny你說得很對;我需要檢查我的視力。 – 2011-04-23 11:09:25

2
DELETE u, m, f, p 
FROM users u 
LEFT JOIN 
     messages m 
ON  m.user_id = u.id 
LEFT JOIN 
     files f 
ON  f.user_id = u.id 
LEFT JOIN 
     posts p 
ON  p.user_id = u.id 
WHERE u.id = 1 

這假定與id = 1記錄在users存在,否則什麼也不會被刪除。

但是,請注意,這不是非常有效,並且四個單獨的刪除將更好地工作。

+0

爲什麼不內連接? – Johan 2011-04-21 15:01:56

+0

@Johan:因爲至少在一個表中沒有'user_id = 1'的記錄,所以內部連接不會刪除任何東西。 – Quassnoi 2011-04-21 15:03:29

1

在你的WHERE中,你有userId ='$ userId'。其他人可以糾正我,如果我錯了,但我敢肯定,userId會不明確,這個聲明不會運行。如果情況確實如此,那麼@John Hartsocks的答案應該可行。

這是除了點雖然。如果您擔心確保用戶被完全刪除,那麼您應該使用外鍵約束。你說當你刪除一個用戶時,你要確保刪除與該用戶有關的所有信息。如果將FK約束添加到每個具有用戶標識的表(除了用戶表,在這種情況下,它將具有主鍵約束),則不應首先確保所有其他用戶刪除用戶引用該用戶的數據被刪除。

+0

它會工作,查詢是在一個PHP字符串。 – 2011-04-21 14:59:48

+0

我不是指$ userId,我指的是左側的userId模糊。儘管人們可能會看到並認爲它可行,但我很確定mySQL不會執行該聲明。我相信在PHP方面,它會正確地構建查詢(讀取:字符串)。 – Dave 2011-04-21 15:07:48