如何在记录39与记录40之间,插入一条新的记录

本文介绍了一种在SQL中插入记录的特殊方法,特别是在需要保持原有记录顺序的情况下如何操作。通过创建临时表并重新插入数据来避免直接更新标识列的问题。

数据表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 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值