2015-07-11 133 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) 
相关问题