Oracle数据库。将行的副本插入同一个表(重复键错误消息)

时间:2014-01-03 16:03:25

标签: sql oracle

在Oracle数据库中,我有一个主键为GAME_ID的表。 我必须在game_name ='Texas holdem'中插入一行副本,但它告诉我:

  

UPDATE或INSERT语句尝试插入重复键。

这是我正在使用的查询:

INSERT INTO GAME (SELECT * FROM GAME WHERE NAME = 'Texas Holdem');

4 个答案:

答案 0 :(得分:12)

假设您的game_id是由序列生成的,您可以在select语句中获取一个新内容:

INSERT INTO GAME (game_id, name, col_3)
SELECT seq_game_id.nextval, name, col_3
FROM GAME 
WHERE NAME = 'Texas Holdem';

答案 1 :(得分:4)

让我提一个稍微抽象的观点......

  • 在关系数据库中,table是关系数学概念的物理表示。
  • Relation是 set (元组,即表行/记录)。
  • 一个集合既包含给定元素,也不包含,它不能多次包含相同的元素(与multiset不同)。
  • 因此,表中永远不会有两个相同的行,仍然会将数据库称为“关系”。 1

您可以插入类似的行,正如其他答案所示。


1 虽然实际的DBMS(包括Oracle)通常允许您创建没有任何密钥的表,但在物理上可以创建相同的重复项。但是,如果您发现自己这样做,请将其视为一个大红旗。

答案 2 :(得分:2)

您只能拥有一行具有相同的键。不要复制密钥。指定要复制的列列表并保留密钥(假设它是自动提供的)。

答案 3 :(得分:0)

您尝试在表格中插入一行。 例如,在您的表中,您有

GAME_ID Name
1       Texas Holdem

您尝试在此行中插入此行,但game_id 1已经存在 所以如果你想插入这个,你需要创建一个这样的新行,以便为这个游​​戏名称生成一个新的game_id:

INSERT INTO GAME(Name) VALUES ('Texas Holdem')