我有一个主键'ID'的表,每次新条目(行)进来时自动递增。最大(ID)现在是18。我想在17和18之间插入一个新行,并且相应地重命名这些ID,如18变为19,新行必须如下18。我知道我会得到一个主键违规错误,是否有可能以任何其他方式做到这一点?
ID---------COLUMNS-----------
17---------OLD ROW-----------
18---------NEW ROW-----------
19---------OLD ROW-----------
我有一个主键'ID'的表,每次新条目(行)进来时自动递增。最大(ID)现在是18。我想在17和18之间插入一个新行,并且相应地重命名这些ID,如18变为19,新行必须如下18。我知道我会得到一个主键违规错误,是否有可能以任何其他方式做到这一点?
ID---------COLUMNS-----------
17---------OLD ROW-----------
18---------NEW ROW-----------
19---------OLD ROW-----------
正如注释中所提到的,id只是一个标识符。它的顺序(甚至值,只要它是唯一的)并不重要。
如果你绝对必须做到这一点,你需要在插入前更改第一列的ID:
UPDATE table SET ID = 19 WHERE ID = 18;
INSERT INTO table (id,foo) VALUES (18,'foo');
虽然阿尔玛做的是正确地说,你的设计是有缺陷的,如果你依赖于一个汽车生成的索引作为排序顺序,您可以通过首先按降序递增值(以便从未有两个具有相同值的记录)来解决唯一性约束:
UPDATE yourtable SET id = id+1 WHERE id >= 18
ORDER BY id DESC; -- here is the trick
不,您不想要要做到这一点。主键与行顺序无关。因此,如果您确实需要连续添加相应的列,但将主键例程保留为DBMS –
在关系数据库中,行没有顺序,因此不会在两个其他行之间插入一行。仅在使用ORDER BY子句查询数据时才应用排序。如果您需要在数据中包含一些排序,那么您需要添加另一个列,您可以随意填写。 –