获得重复的PRIMARY KEY时出错。如何在多个表中使用相同的PRIMARY KEY?显示我如何在下表中使用它将非常感激。错误是com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolati onException:键'PRIMARY'的重复条目'Jam'
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)
您的问题不是跨表具有相同的主键,而是给定的表只能有一个给定主键的实例。如果您要添加数据并尝试添加Jam
而Jam
已在表中,则会抛出您看到的错误。您当前的架构只允许每个玩家拥有一行。如果这是目标,那么你可能想让它们成为一个大桌子。
但是,我怀疑你真正感兴趣的是foreign keys并且这三个表引用了一个表,我怀疑是players
。在这种情况下,请更改
PRIMARY KEY (playerName)
到
FOREIGN KEY (playerName) REFERENCES players(playerName)
答案 1 :(得分:0)
您无法在多个表中传播主键。你应该有一个名为players
的表,每个玩家一行,这三个表应该有一个指向它的外键。
playername
列确实可以是您希望它的3个表格中的每一个的主键,但它不太可能是您真正想要的。如果你希望这些表中的每个玩家有多个行,那么它不应该是这些表上的PK。
主键意味着两件事:
您收到的错误反映了您要插入的行会违反#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;
注意:如果您想要这种效果,可以将限制更改为级联(如果您尝试更改或删除播放器表中的播放器,则可以根据您希望发生的情况)