Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL主键重复错误3个表中的同一主键_Mysql_Sql - Fatal编程技术网

Mysql SQL主键重复错误3个表中的同一主键

Mysql SQL主键重复错误3个表中的同一主键,mysql,sql,Mysql,Sql,获取具有重复主键的错误。如何在多个表中使用相同的主键?如果能在下表中展示我如何使用它,我将不胜感激。错误为com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolati 一个例外:按键“PRIMARY”重复输入“Jam” CREATE TABLE `skills` ( `playerName` varchar(15) NOT NULL default '', `testa` double defaul

获取具有重复主键的错误。如何在多个表中使用相同的主键?如果能在下表中展示我如何使用它,我将不胜感激。错误为com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolati 一个例外:按键“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;

您的问题并不是跨表具有相同的主键,而是给定表只能具有给定主键的一个实例。如果您正在添加数据,并试图在Jam已在表中时添加Jam,它将抛出您看到的错误。当前模式只允许每个玩家有一行。如果这是目标,那么你可能想让他们成为一个大桌子

然而,我怀疑你真正感兴趣的是,让这三个表引用一个表,我怀疑称之为玩家。在这种情况下,改变

PRIMARY KEY (playerName)


不能将主键分散到多个表中。您应该有一个名为players的表,每个player有一行,这3个表应该有一个外键指向该外键

playername列确实可以是您所希望的3个表中每个表的主键,但这不太可能是您真正想要的。如果您希望在这些表中的任何一个表中每个玩家都有一行以上,那么这些表上不应该有PK

主键正好意味着两件事:

唯一2行中的列可以具有相同的值 非空 您得到的错误反映了您插入的行将违反1

players表的外键确保引用完整性。基本上,没有为不存在的玩家存储任何东西。并且那些数据被存储的玩家在数据被移除之前不会被移除,等等

这是第一个表的DDL在FK到玩家表时的样子。您应该有这样一个表:

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;

注意:如果您想要根据您想要发生的情况将限制更改为级联,如果您试图更改或删除玩家表中的玩家,则可以将限制更改为级联

是否是装箱表中的错误或添加数据时的错误?取消默认设置为zanny。做你想做的事没问题。但在添加数据时,每个表只能出现一次pk值。是的。每个表上的外键名称必须不同,但在其他方面相同。关键字的名称紧跟在单词constraint之后。您还可以省略约束xyz部分,让它每次为您指定一个系统生成的名称。
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;