2016-09-22 120 views
0

我在使用mysql進行內連接時遇到了一些問題。INNER JOIN - Mysql和PHP

我有以下代碼:

DELETE T1,T2 FROM table1 AS T1 INNER JOIN table2 AS T2 ON T1.id = T2.pageid WHERE T1.ID = 2 

這裏的問題是,如果有什麼在表2中刪除。

例如,如果table1和table2具有ID 2,則它們都會刪除。如果僅在table1中存在ID 2,則它不會刪除表1中的記錄。

我已經嘗試過使用外鍵,但它不工作,要麼:

CREATE TABLE banners (
    id int(11) NOT NULL AUTO_INCREMENT, 
    username TEXT NOT NULL, 
    pageid int(11) NOT NULL, 
    sitename TEXT NOT NULL, 
    imgurl TEXT NOT NULL, 
    refurl TEXT NOT NULL, 
    clicks int(11) NOT NULL, 
    PRIMARY KEY (id), 
    KEY pageid (pageid), 
    CONSTRAINT edits_ibfk_1 
    FOREIGN KEY (pageid) 
    REFERENCES pages (id) 
    ON DELETE CASCADE 
) 

如果我使用SQL:

DELETE FROM banners WHERE id= ? 

它只是從表1和表2留下記錄有:(

刪除

我寧願用SQL查詢來做這件事。在這種情況下有人可以幫我嗎? Thanks!

+1

使用左連接而不是內連接(t1似乎是父表),或者如果使用外鍵,則從父表中刪除,而不是從子級觸發級聯刪除。橫幅表格是您的子表格,頁面是父級表格。 – Shadow

+0

謝謝。有效! – Tiago

回答

1
  1. 使用左連接而不是內連接(t1似乎是父表)。無論在右表中有多少匹配記錄,左連接都會從左表中獲取所有記錄。

  2. 如果使用外鍵,則從父表中刪除,而不是從子級觸發級聯刪除。橫幅表是您的子表,頁面是父級,因爲橫幅引用了頁表。從子項刪除記錄不會影響父表。

1

從你的描述,似乎你banners表(表1)是依賴於表2

表1參考表2,表而2「不關心」關於表1(表1的外鍵是獨立實體)。從表1中刪除項目時,數據完整性不會被破壞,因爲沒有其他實體引用表1中的特定行。

ON DELETE CASCADE如果您刪除了表2(頁)中的一行,它將生效。橫幅表中引用已刪除行的行也將被刪除。

換句話說,如果父母被刪除,ON DELETE CASCADE也會刪除孩子。但是,如果孩子被刪除,父母將保持機智。

您需要驗證此父子關係是否正確。如果banners應該是pages的子項,則需要將外鍵列移動到pages表。然後,您的第二個查詢將導致刪除子女pages以及指定的banner

如果您當前的模式正確,您可以簡單地刪除父母pages,並且子女banners將被刪除。