数据表tbLink
create table tbLink_1011(
linkid int identity(1,1) not null,
linkUrl nvarchar(500) not null,
linkWord nvarchar(255) null,
channeltype int null,
linktype int null,
logourl nvarchar(500) null,
state int null,
showstate int null,
orderid int null
)
从上面可以看出,没有主键,是自动递增的标识列
要求1:在记录39与记录40之间,插入一条记录
临时表tbLink_1011
create table tbLink_1011(
linkid int identity(1,1) not null,
linkUrl nvarchar(500) not null,
linkWord nvarchar(255) null,
channeltype int null,
linktype int null,
logourl nvarchar(500) null,
state int null,
showstate int null,
orderid int null
)
编号40一直到63,都有数据
方法1:
我本来想一条条更新,太麻烦。网上没有看到好的方法。
update tbLink set Linkid = 55 where Linkid = 54 || 提示:无法更新标识列
没有主键,是自动递增标识列,无法更新,自己方法不行,虽然麻烦。
方法2:
首先把40和它之后的数据保存到临时表中 || 可以实现
然后删除删除40和它之后的数据 || 可以实现
最后把临时表的数据插入 || 类似 可以实现 || 思路 错误细节
总结,把表中的数据一次性插入到别一个表中,来自阿伟
--保存数据 设置自增,不能显式
--INSERT INTO tbLink_1011(linkid,linkUrl) 语法错误自增字段,不能显式
--INSERT INTO tbLink_1011(linkUrl) 正确写法
INSERT INTO tbLink_1011( linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid)
SELECT linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid
FROM tbLink
le
WHERE linkid= 283
可以多条插入,如果插入一条,只要指定linkid,不用指定linkUrl, linkWord, channeltype等字段的值。
INSERT INTO tbLink_1011( linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid)
SELECT linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid
FROM tbLink order by linkid
le
WHERE linkid= 283
这种写法语法错误
INSERT INTO tbLink_1011( linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid)
SELECT linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid
FROM tbLink order by linkid
le
WHERE linkid= 283 order by linkid
正确写法
这样尝试:
首先order by linkid,所有记录一起插入。发现两张表,记录顺序不同。
然后order by linkid,尝试5条一起插入,10条一起插入,记录顺序还是有点问题。
要求2:显示出来,与原来必须相同。如果顺序不同,肯定出现问题。

后面发现,原来表tbLink,并不是order by linkid
1 251-282 原来顺序
2 110-171
3 223-234
4 1-39 待插入的记录 40
5 40-63
6 105
7 76-109
8 172-222
9 237-250最后一条记录编号250 内部编号246 说明数据表中共246条记录
尝试2:
1
INSERT INTO tbLink_1011( linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid)
SELECT linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid
FROM tbLink order by linkid
le
WHERE linkid >=251 and linkid <=282
order by linkid --原来表中,从251到282是排序的,必须加上。
2
INSERT INTO tbLink_1011( linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid)
SELECT linkUrl, linkWord, channeltype, linktype, logourl, state, showstate, orderid
FROM tbLink order by linkid
le
WHERE linkid >=110 and linkid <=171
order by linkid
直到9
然后修改表名,不用再将临时表tbLink_1011的数据插入tbLink,直接修改tbLink为tbLink11,
tbLink_1011为tbLink,就可以了。
这样,满足了两个要求:插入记录,显示顺序没有改变、变动。
带了一个问题,多插入了一条相同记录,一个246,一个247。
这个不影响,安排时间解决一下。
总结:以上情形,在自己工作中时常遇到,今天终于弄个彻底。
之前,由于数据比较少,没有在意顺序这个要求。
补充:
Teacher (id,name)
select * from Teacher order by case id when 38 then 1 else 0 end
OK !
本文介绍了一种在SQL中插入记录的特殊方法,特别是在需要保持原有记录顺序的情况下如何操作。通过创建临时表并重新插入数据来避免直接更新标识列的问题。

被折叠的 条评论
为什么被折叠?



