Mysql

將數據插入 3NF 數據庫

  • October 12, 2018

我有 6 個表,每個表有 ~2-15 個屬性,這 6 個表中的每一個都有一個受另一個表約束的 ID。第 7 個表有自己的 ID 和其他 6 個表 ID,以及日期和註釋屬性。這是我創建的第一個 3NF 數據庫,具有這麼多屬性,我很困惑當我將數據添加到前 6 個表時,id 將插入到第 7 個表中。

在此處輸入圖像描述

很抱歉刪除了表屬性名稱,它不是最高機密或任何我寧願不將資訊放到網上的東西。

至於我到底需要做什麼,是創建一個將這些表中的每一個與單個表相關聯的記錄。

通常,您必須將記錄插入“從屬”表,然後將記錄插入“主”表,通過剛剛插入的值選擇從屬 ID:

INSERT INTO slave1 (field1_1, ...) 
   VALUES (value1_1, ...);

INSERT INTO slave2 (field2_1, ...) 
   VALUES (value2_1, ...);

...

INSERT INTO main (slave1_id, slave2_id, ...)
   VALUES ( (SELECT id FROM slave1 WHERE field1_1 = value1_1 AND ...),
            (SELECT id FROM slave2 WHERE field2_1 = value2_1 AND ...),
            ...
          );

在某些情況下(當您可以保證所有查詢將在同一個連接中執行或您的連接器允許多查詢,並且所有從屬 ID 都是自動增量時)您可以獲取每個從屬表的 LAST_INSERT_ID() 並在插入時使用它進入主表。

INSERT INTO slave1 (field1_1, ...) 
   VALUES (value1_1, ...);

SET @id1 := LAST_INSERT_ID();

INSERT INTO slave2 (field2_1, ...) 
   VALUES (value2_1, ...);

SET @id2 := LAST_INSERT_ID();

...

INSERT INTO main (slave1_id, slave2_id, ...)
   VALUES ( @id1, @id2, ... );

最好的解決方案(我認為)是使用一個儲存過程,它接受所有表的所有參數並執行您需要的所有操作。

當然,您必須考慮到任何插入都可能因任何原因而失敗,並採取一切措施避免數據不一致。例如,交易可以提供幫助。

引用自:https://dba.stackexchange.com/questions/219911