2015-07-11 131 views
0

獲取重複主鍵的錯誤。我如何跨多個表使用相同的主鍵?展示如何在下面的表格中使用它將非常感激。該錯誤是com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolati onException的:重複錄入「果醬」關鍵「主要」SQL PRIMARY KEY重複錯誤與3個表中的PRIMARY KEY相同

CREATE TABLE `skills` (
     `playerName` varchar(15) NOT NULL default '', 
     `testa` double default NULL, 
     `testb` double default NULL, 
     `testc` double default NULL, 
     `testd` double default NULL, 
     PRIMARY KEY (`playerName`) 
    ) ENGINE=MyISAM; 

    CREATE TABLE `playerrights` (
     `playerName` varchar(15) NOT NULL default '', 
     `rank` int(2) default NULL, 
     PRIMARY KEY (`playerName`) 
    ) ENGINE=MyISAM; 

    CREATE TABLE `skillsoverall` (
     `playerName` varchar(15) NOT NULL default '', 
     `lvl` int(11) default NULL, 
     `xp` BIGINT(11) default NULL, 
     PRIMARY KEY (`playerName`) 
    ) ENGINE=MyISAM; 
+0

是在錯誤的影響限制在級聯創建表格還是添加數據? –

+0

殺死zanny的默認值。做你想做的事沒問題。但是每增加一個數據,每個表只能出現一次pk值 – Drew

+0

。 – Joliquine4

回答

0

不能分佈在多個表的主鍵。你應該有一個名爲players的表,每個玩家一行,這3個表應該有一個指向那個外鍵。

playername列確實可以作爲您所希望的3個表中的每一個的主鍵,但這不太可能是您實際需要的。如果你想在這些表中有每個玩家多於一行的話,那麼它就不應該是這些表中的PK。

主鍵表示正好兩件事情:

  1. 獨特(沒有兩行可以有柱(一個或多個)相同的值)
  2. 非空

你得到了錯誤反映你插入的行會違反#1。

players表的外鍵是確保引用完整性的原因。基本上沒有任何東西存儲在不存在的玩家身上。在統計數據被刪除之前,他們的統計數據不會被刪除等。

這就是您的第一張桌子的DDL看起來像FK到players表(應該有這樣一張表):

CREATE TABLE `skills` (
    `playerName` varchar(15) NOT NULL default '', 
    `testa` double default NULL, 
    `testb` double default NULL, 
    `testc` double default NULL, 
    `testd` double default NULL, 

    index (playername), 

    constraint fk_playername_rights 
    foreign key (playername) references players (playername) 
    on delete restrict 
    on update restrict 

) ENGINE=MyISAM; 

注意:你可以改變,如果你想(根據你想有,如果你試圖改變或在球員表中刪除一個球員發生什麼)

+0

我對其他兩個表格使用相同的格式嗎? – Joliquine4

+0

是的。外鍵的名稱必須在每個表上不同,但在其他方面是相同的。密鑰的名稱緊跟在「約束」一詞後面。你也可以省略'constraint xyz'部分,並讓它每次爲你分配一個系統生成的名字。 –

0

你的問題不在於你有跨表相同的主鍵,是給定的表只能有給定主鍵的一個實例。如果您要添加數據並嘗試添加Jam,而Jam已在表格中,則會拋出您看到的錯誤。您目前的架構只允許您爲每個玩家設置一行。如果這是目標,那麼你可能想讓他們成爲一張大桌子。

但是,我懷疑你真正感興趣的是foreign keys,並有這三個表引用一張表,我懷疑叫players。在這種情況下,改變

PRIMARY KEY (playerName) 

FOREIGN KEY (playerName) REFERENCES players(playerName) 
相關問題