2012-02-21 23 views
2

我想完全理解關係,並且經歷了很多教程。我仍然苟延殘喘幾件事情(使用MySQLWORKBENCH): enter image description here 1.每個用戶都可以上傳產品 2.每個產品可以有多個類別,投標,評分等 3.每個用戶都可以擁有多個PHONENUMBERS (有比較多,但是這是基本的設置)MYSQL建模關係:設計和更新/刪除

這是正確的?: 1 - 我用了1:N的關係,因爲每個用戶都可以上傳多個產品。 2和3。我用N:M關係,因爲可以有多個產品具有多個類別,出價,評級等

刪除/更新: 我用ON UPDATE CASCADE和ON DELETE CASCADE到處其中有一個外鍵......即'產品','category_tags_has_products','bid_price_has_product','phone_has_user'。我嘗試刪除一個像這樣的產品(php):mysql_query(「DELETE FROM product WHERE id ='$ id'」); 我得到一個1054錯誤,這是一個外鍵錯誤。 這裏有什麼最佳實踐?據我的理解,我不應該在父表之外進行刪除操作。

Thanx!

回答

1

您有很多標識關係,這表示外鍵構成第二張表上主鍵的一部分。這在大多數情況下不是必需的,並且僅在鏈接表等實例中非常有用。

爲此,我會將用戶 - >產品鏈接更改爲非標識,這將使user_id成爲外鍵而不是主鍵的一部分。在工作臺中,1:n非識別關係的快捷鍵是關鍵'2'(其中'4'是識別關鍵字)。這反過來應該從產品鏈接到的表中刪除user_id字段。

當你刪除一個產品時,它應該級聯到它鏈接到的3個鏈接表。目前它可能正在嘗試從用戶中刪除,具體取決於FK的設置。以下應級聯刪除(假設刪除是永久性的,並且您只想清除所有鏈接的記錄)

刪除產品 - >刪除任何帶有product_id的表格 DELETE FROM用戶 - >從任何具有user_id的表中刪除在

這同樣適用於電話,評級,bid_price,category_tags。

我希望這一點,如果使用的,如果您需要任何進一步的指針隨意喊:)

+0

將用戶 - >產品鏈接更改爲非標識。 – user1163859 2012-02-21 14:42:52

+0

我刪除像這樣︰$ query =「DELETE FROM product WHERE id ='$ id'」; var_dump($ query); mysql_query($ query); – user1163859 2012-02-21 14:43:16

+0

$ id = product_id – user1163859 2012-02-21 14:43:53

1

關係看起來正確。 要查明您的查詢出了什麼問題,請檢查$id變量。 或者檢查整個查詢,然後在控制檯/ phpMyAdmin的/等運行它:

$query = "DELETE FROM product WHERE id='$id'"; 
var_dump($query); 
mysql_query($query); 

P.S:不要忘記逃脫從用戶得到的所有數據!像這樣:

$id = mysql_real_escape_string($_GET['id']); 
+0

感謝。但是,這仍然行不通。我試圖刪除使用phpmyadmin,但我得到這個錯誤: – user1163859 2012-02-21 14:22:16

+0

#1451 - 無法刪除或更新父行:外鍵約束失敗('databasename'.'category_tags_has_product',CONSTRAINT'fk_category_tags_has_product_product1' FOREIGN KEY('product_id',''在'category_tags_has_product.product_id'上放置'ON UPDATE CASCADE'和'ON DELETE CASCADE'。 – user1163859 2012-02-21 14:25:50

+0

參考'product'('id','user_id')ON DELETE NO AC)目前,您似乎沒有針對'ON DELETE'的操作,並且當您試圖從'product'表中刪除產品時,相應的記錄會保留在'category_tags_has_product'表中並且會出錯,因爲'category_tags_has_product'中的記錄嘗試指向「產品」表中已刪除的行。 – Minras 2012-02-21 15:45:40