日期:2014-05-19  浏览次数:20513 次

如何把一个记录指定插入到自增一的后面?
如何把一个记录强行指定插入到自增一?不好描述,举个例子
一个表  
主键id,id是自增一,现在已有3条记录,主键id分别是1,2,3,现在有一条新记录,我要把它插入到id=2的记录,原来的id=2的记录,依次类推,变成id=3的记录,原来id=3,变成id=4的记录
不知道sql能不能实现,请高人指教!


------解决方案--------------------
update table1
set id=id+1
where id> =2
insert table1(ID)
values( '2 ')
------解决方案--------------------
主键id 是不能更新的
------解决方案--------------------
在插入之前要先取消自增列属性,
SET IDENTITY_INSERT TableName ON
INSERT INTO 。。。。。。。。。。。。
SET IDENTITY_INSERT TableName OFF

然后用触发器先修改主键id列然后在插入
------解决方案--------------------
自增标识列不允许修改.
------解决方案--------------------
这个有必要吗?
如果做排序可以用别的字段。

------解决方案--------------------
给你一个办法:

添加一个字段myOrder,类型为float,起始为1,如果添加到最后一行,则数值是最后一行值+1,
如果插入中间,则数值是插入前后两个值/2,如果插入第一行,则数值为第一行数值/2,例子:
ID---myOrder
1---1
2---2
3--3

添加到最后一行
1---1
2---2
3---3
4---4 // 这里4就是3+1

中间增加一行
1---1
2---2
3---3
4---4
5---2.5 // 这里2.5就是(2+3)/2

首列增加一行
1---1
2---2
3---3
4---4
5---2.5
6---0.5 // 这里0.5就是1/2

所以,如果按照myOrder Asc重排,就可以得到你要的结果
6---0.5
1---1
2---2
5---2.5
3---3
4---4
------解决方案--------------------
注意,这里说的数值,不是ID的数值,是myOrder的数值。
------解决方案--------------------
因为你指定要插入哪两条记录中间,这样你的表势必需要重新排列过,如果表的数据量很大,每次重排会造成很多问题,直接插入是最好的。根据重排结果,你一定会知道你需要在哪两个行之间插入数值,因为这个是问题的初始条件,这时候只要把这两行的myOrder拿出来,加起来/2,就得到了新的myOrder数值。
------解决方案--------------------
CREATE PROCEDURE GET_NEXT_ORDER
@ID bigint
@NEW_ORDER float OUTPUT
AS
BEGIN
DECLARE @ORDER float, @NEXT_ORDER float
SET @ORDER=(SELECT myOrder FROM T1 WHERE ID=@ID)
SET @NEXT_ORDER=(SELECT TOP 1 myOrder FROM T1 WHERE myOrder> @ORDER)
SET @NEW_ORDER=(@ORDER+@NEXT_ORDER)/2
RETURN
END

这样就可以找到你需要纪录的下一个Order number了。
------解决方案--------------------
象楼主这样的需求在去年还有几个,今年则少见.
因为自增标识列只允许显式INSERT,但不允许UPDATE,所以要实现这样的功能,不能在自增标识列上实现,只能在整数列上实现.
在int列上实现的方法通常是使用触发器,插入时制定该列的序号值,然后在触发器中对大于该值的所有列重新排序并更新,这样看起来就象插入到了指定位置.
------解决方案--------------------
这里修改一下,
SET @NEW_ORDER=(@ORDER+@NEXT_ORDER)/2

改为
IF @NEXT_ODER IS NULL
BEGIN
SET @NEW_ODER=@ORDER+1
END
ELSE
BEGIN
SET @NEW_ORDER=(@ORDER+@NEXT_ORDER)/2

整理一下

CREATE PROCEDURE GET_NEXT_ORDER
@ID bigint
@NEW_ORDER float OUTPUT
AS
BEGIN
DECLARE @ORDER float, @NEXT_ORDER float
SET @ORDER=(SELECT myOrder FROM T1 WHERE ID=@ID)
SET @NEXT_ORDER=(SELECT TOP 1 myOrder FROM T1 WHERE myOrder> @ORDER)
IF @NEXT_ODER IS NULL
BEGIN
SET @NEW_ODER=@ORDER+1
END
ELSE
BEGIN
SET @NEW_ORDER=(@ORDER+@NEXT_ORDER)/2
RETURN
END
END

这里增加了对最后一个记录的下一个记录情况下的支持。