2014-01-14 108 views
0

我有一个主键'ID'的表,每次新条目(行)进来时自动递增。最大(ID)现在是18。我想在17和18之间插入一个新行,并且相应地重命名这些ID,如18变为19,新行必须如下18。我知道我会得到一个主键违规错误,是否有可能以任何其他方式做到这一点?

ID---------COLUMNS----------- 

17---------OLD ROW----------- 
18---------NEW ROW----------- 
19---------OLD ROW----------- 
+6

不,您不想要要做到这一点。主键与行顺序无关。因此,如果您确实需要连续添加相应的列,但将主键例程保留为DBMS –

+0

在关系数据库中,行没有顺序,因此不会在两个其他行之间插入一行。仅在使用ORDER BY子句查询数据时才应用排序。如果您需要在数据中包含一些排序,那么您需要添加另一个列,您可以随意填写。 –

回答

0

正如注释中所提到的,id只是一个标识符。它的顺序(甚至值,只要它是唯一的)并不重要。

如果你绝对必须做到这一点,你需要在插入前更改第一列的ID:

UPDATE table SET ID = 19 WHERE ID = 18; 
INSERT INTO table (id,foo) VALUES (18,'foo'); 
0

虽然阿尔玛做的是正确地说,你的设计是有缺陷的,如果你依赖于一个汽车生成的索引作为排序顺序,您可以通过首先按降序递增值(以便从未有两个具有相同值的记录)来解决唯一性约束:

UPDATE yourtable SET id = id+1 WHERE id >= 18 
ORDER BY id DESC; -- here is the trick 
相关问题