2017-06-28 107 views
1

我有兩個表:消息和產品。 在消息表中,有一個sourceid,它等於表Product下的ProductId。是否可以在phpmyadmin中添加一個條件到外鍵約束?

產品有一個產品ID(productID),用戶可以向賣方發送產品信息。對於這些消息,如果它們與特定的產品相關,而不是它們給出的sourceid,這基本上是產品ID。如果消息與任何產品無關,則sourceid將設置爲0.

我可以設置外鍵約束來刪除消息條目,只要賣家刪除產品,所有相關消息都將被刪除。

但是,我發現所有與產品無關的消息(sourceid設置爲0)並未保存在數據庫中。很明顯,因爲沒有productid = 0的產品,並且外鍵約束將立即刪除消息條目(帶有sourceid = 0)。

有沒有辦法在phpmyadmin中設置條件?如果我可以設置,如果外鍵約束只在sourceid> 0時執行,那麼系統應該運行。但我不知道如何設置這個條件,或者如果phpmyadmin允許設置這個條件。

請幫忙。非常感謝。

回答

0

您可以使用ON DELETE CASCADE外鍵定義Message表:

CREATE TABLE Message (
    messageid INT(11) NOT NULL AUTO_INCREMENT, 
    message VARCHAR(255) NOT NULL, 
    -- other columns 
    sourceid INT(11) NOT NULL, 
    PRIMARY KEY (messageid), 
    FOREIGN KEY (sourceid) REFERENCES Product(ProductId) ON DELETE CASCADE 
) ENGINE=InnoDB; 

如果你不想重新定義整個表,你可以使用下面的ALTER TABLE聲明:

ALTER TABLE Message 
ADD CONSTRAINT fk_pid 
FOREIGN KEY (sourceid) 
REFERENCES Product (ProductId) 
ON DELETE CASCADE 

通過此更改,從Product表中刪除產品記錄將導致其所有對應的消息Message也被刪除。

+0

因此,所有我需要做的是設置的SourceID爲null每當引用與產品無關的消息而不是0時? – Kevin

+0

@Kevin我不知道你有什麼想法,但按照Bill Karwin的回答,如果你將'ProductId'設置爲'NULL',然後刪除那條記錄,它應該忽略相應消息的級聯刪除。 –

2

是的,如果外鍵與某些消息不相關,請將product_id外鍵列設爲空。如果您不想引用任何產品,請存儲NULL而不是0。出於外鍵引用的目的,NULL被忽略。

這是幾乎相同的,因爲我回答了這些過去的問題:

+0

因此,只要引用與產品無關的消息,我所要做的就是將sourceid設置爲null而不是0。 – Kevin

+0

如果事實上一樣,你可以把這個問題作爲一個重複來解決。我認爲OP實際上是在問很多事情。由於某種原因,我給出了關於'ON CASCADE DELETE'的答案:-) –

+0

我在想另一種解決方法,是否可以在phpmyadmin中設置,當產品被刪除時,相關的消息條目會將其sourceid更新爲0? – Kevin