2011-06-16 120 views
0

我有兩張表,我試圖做的事很簡單,但同時又相當複雜 - 如果有人能幫助我,那將會很棒。MySQL表更新

我有以下表...

Table A 
ClientID 
1 
2 
3 

Table B 
ClientID  ID 
1    
1 
3 

表B在表中的客戶端ID的也是如此表A.於是他們聯繫起來,我需要做的是更新ID爲獨特的參考。

即clientID-UniqueID。例如,如果我更新了表B,我希望它看起來像這樣(順序)

Table B 
ClientID   ID 
1     1-1 
1     1-2 
3     3-1 
+0

你能解釋爲什麼第二行的ID是1-2嗎?那是第二個ClientID?我試圖找出你的邏輯是爲了創建UniqueID。 – IAmTimCorey 2011-06-16 14:45:44

回答

5

Theres沒有任何理由這樣做。只需要我們在table_b.id上標準的自動增量主鍵。

使用InnoDB的架構看起來像:

CREATE TABLE `table_a` (
    `id` UNSIGNED integer AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CREATE TABLE `table_b` (
    `id` UNSIGNED integer AUTO_INCREMENT, 
    `client_id` UNSIGNED integer, 
    PRIMARY KEY (`id`), 
    KEY (`table_a_id`), 
    CONSTRAINT `table_b_table_a_id_table_a_id` 
    FOREIGN KEY (`table_a_id`) 
    REFERENCES `table_a` (`id`) 
    ON DELETE CASCADE 
) ENGINE=InnoDB; 

剎那間注意到一些關鍵點:

  • InnoDB支持外鍵和相關聯的完整性執法行動。通過使用table_b上的外鍵約束與ON DELETE CASCADE任何時候刪除條目表table_a時,table_b中的table_a_id(以前的ClientID)對應於刪除的條目的所有條目也將被自動刪除。如果這不是所需的行爲,可以採取其他行動。

  • 我已經標準化了你的列名。出於便攜性的原因,你永遠不要使用駱駝大小寫欄或表名。而是使用全部小寫字母。如果要區分詞組中的詞,請使用_作爲詞分隔符。

  • 您應該有一致的列和索引/鍵命名約定。每個表中的所有主鍵都應以相同的方式命名。另外,外鍵列應該使用一個命名約定,明確標識它們鏈接的外表和列。這有助於使開發人員在嘗試編寫/調試/優化查詢時更輕鬆,因爲這不一定需要檢查實際模式以找出結果。

+1

*'我已經規範化了你的列名。出於便攜性的原因...'*您能否引用此消息來源或解釋它?我以前沒有聽說過這個問題。 – Hammerite 2011-06-16 15:13:16

+0

mysql在區分大小寫的系統(即* nix)和大小寫不敏感的系統(windows)時區分大小寫。如果您需要同時支持或不能100%確定最終安裝目標是什麼,請避免使用任何種類的混合大小寫(駱駝或其他)來表名和列名。雖然我通常只支持nix,但我只是確保我使用的慣例是爲了以防萬一,因爲它只是讓一個約定變得更容易,並且不會一直切換它。 – prodigitalson 2011-06-16 15:32:19

0

你可能想嘗試像以下(假設ID已經在B列):

ALTER TABLE B MODIFY COLUMN ID INT AUTOINCREMENT, ADD PRIMARY KEY (ClientID, ID) 

如果ID是尚未B您可以改用

ALTER TABLE B ADD COLUMN (ID INT AUTOINCREMENT), ADD PRIMARY KEY (ClientID, ID) 

我認爲這將使ID有一個單獨的增量計數器爲每個不同ClientID