2015-10-16 20 views
-1

我對我的數據庫有一個特殊的設置。 (見附件截圖)一對多的逆轉關係?

所以我有實現和項目,他們可以有一個附加到他們的畫廊,畫廊包含圖片。

現在我似乎無法使關係,如果我刪除一個實現,或項目,附加的庫也被刪除。

我已經試過外鍵,在畫廊表和實現/項目表上的組合。

任何想法我可以監督什麼?謝謝!

enter image description here

這是我嘗試

ALTER TABLE `galleries` 
ADD CONSTRAINT `FK_galleries_realisations` FOREIGN KEY (`id`) REFERENCES `realisations` (`gallery_id`) ON UPDATE CASCADE ON DELETE CASCADE; 

的SQL這是我的錯誤,當我嘗試創建一個新的認識

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`elbeko`.`galleries`, CONSTRAINT `FK_galleries_realisations` FOREIGN KEY (`id`) REFERENCES `realisations` (`gallery_id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `galleries` (`name`, `updated_at`, `created_at`) values (Tester, 2015-10-16 08:53:28, 2015-10-16 08:53:28)) 
+0

那麼該代碼是在laravel(遷移),但它更是一個關於邏輯問題。在關係所在的桌子上,更多是我的問題。謝謝。 – Notflip

+0

嘗試過,但遇到錯誤,我會將我的代碼添加到問題中,1分鐘! – Notflip

+0

我加了更多解釋。謝謝 – Notflip

回答

1

它不是一個特殊的,而是「潛在的「危險的建築,你在那裏。 根據您的圖表,許多項目可能指向一個圖庫,並且如果刪除了一個項目,則不想刪除圖庫。因爲其他項目「可能」仍然使用該特定畫廊。

您可以修改您的圖庫表格,以便每個圖庫記錄指向項目/實現ID/UUID,以便您可以利用級聯。

如果您確實要刪除圖庫記錄,請使用觸發器「刪除後」 並執行。

  1. 在所有其他記錄上設置gallery_id = null inc。其他表
  2. 從庫表中刪除
  3. 其中gallery_id = old.gallery_id

再次...非常危險恕我直言。

如果你想規範你的表,你可以簡單地爲每個項目和實現創建兩個圖庫表你可以利用G/UUID的優勢,並有一個圖庫表。

GUID被認爲是全球唯一的標識符。 MSSQL將其稱爲GUID,MySQL將其稱爲UUID(通用唯一標識符)

GUID用於在整個應用程序中使用唯一的ID。就你而言,由於project_id和realisation_id可以具有相同的值,因此不能將該字段用作庫表中的常用外鍵。

爲了有一個畫廊表和使用的GUID

  1. 添加 「之前插入」 觸發一個新的領域被稱爲project_uuid VARCHAR(36)NOT NULL默認的 「0」
  2. 添加/修改您tbl_project表
if(length(coalesce(new.project_uuid,'')) <> 36) then 
    set new.project_uuid = (select UUID()); 
end if 

當您插入一個項目的記錄,這將產生新的GUID每次。

  • 通過
  • Update tbl_project 
    set project_uuid = (Select uuid()) 
    Where tbl_project.project_id >= 1; 
    

    的現有項目的記錄現在,所有指定用於現有項目的記錄新的GUID有一個唯一的GUID分配

    1. 對實現表格做同樣操作
    2. 現在,在您的畫廊表中添加一個新的領域owner_uuid VARCHAR(36)
    3. 理想的情況下你的庫表結構是這樣的
    Gallery_id int, not null, primary, auto increase 
    owner_uuid varchar(36) ' usually second primary but for the migration it can be null 
    gallery_name .... 
    ... 
    
    1. 現在你需要更換具有唯一GUID的舊ID

      Update tbl_gallery inner join tbl_project on tbl_project.gallery_id = tbl_gallery.id 
      SET owner_uuid = tbl_project.project_uuid 
      Where tbl_gallery.owner_uuid is null; 
      
    2. 執行相同的實現表

    現在你可以有簡單的1:項目<>畫廊和實現<>庫表之間的N個級聯關係。

    現在,當您創建一個畫廊記錄,您將使用

    Insert into tbl_gallery(id, owner_uuid, name) 
    VAlues(
    null, 
    either project_uuid or realisation_uuid 
    name); 
    
    +0

    謝謝!我意識到奇怪的數據庫結構。但我在想,如果我想添加一個ID的實現或項目會有重複的ID的權利?謝謝你的好回答 – Notflip

    +0

    你可以修改你的表嗎? @Notflip –

    +0

    Offcourse! :)我會很高興..但不知道如何實現你的想法。這樣我確實可以使用級聯。因爲項目ID可以與實現ID相同。 – Notflip