2 child 1986 child_1986 于 2015.06.03 09:37 提问

sqlserver A表插入B表后如何返回A表原有ID和插入B表后新增ID的对应关系

表:A

id(自增), name

1 ‘a’

2 ‘b’

表 B
id(自增), name

3 'c'
4, 'd'

执行
insert into B(name) select name from A

表 B

id(自增), name

3 'c'
4 'd'
5 'a'
6 'b'

现在的问题是如何返回 A表插入B表后新增的ID及原A表的ID对应关系

newID oldID

5 1
6 2

5个回答

beacon_2011
beacon_2011   Rxr 2015.06.03 09:43

这个不大多都是框架来做么?你数据层用的什么呀?

child_1986
child_1986 是希望能用sql语句来做
2 年多之前 回复
bdmh
bdmh   Ds   Rxr 2015.06.03 09:43

你最好不要变动key,如果是自增,除非你有另一个字段作为匹配,否则基本对不上,所以最好自己维护一个key

child_1986
child_1986 不动key,只是希望得到新的ID和老的ID之间的对应关系,因为还要处理ID关联的其他表
2 年多之前 回复
jiuqiyuliang
jiuqiyuliang   2015.06.03 09:46

根据A表的name值,做一个连接查询,查询A表和B表中name值相同的数据,将NewID,OldID查询出来并返回

child_1986
child_1986 回复于亮: 这样只能循环逐行插入了吧,不想用循环,希望能直接insert into B select from A这样简洁一些
2 年多之前 回复
jiuqiyuliang
jiuqiyuliang 回复child_1986: 建立一个第三张表,插入数据时也想第三张表插入一条,有一个自增主键,其他字段用A,B表主键等
2 年多之前 回复
child_1986
child_1986 回复于亮: 可以有临时表,但是我没想明白逻辑怎么弄,关联的时候只能用ID啊
2 年多之前 回复
child_1986
child_1986 回复于亮: 可以有临时表,但是我没想明白逻辑怎么弄,关联的时候只能用ID啊
2 年多之前 回复
jiuqiyuliang
jiuqiyuliang 回复child_1986: 能不能通过第三表来联系表A和B
2 年多之前 回复
child_1986
child_1986 回复于亮: 不行哦,B表太大,加字段认为开销太大
2 年多之前 回复
jiuqiyuliang
jiuqiyuliang 回复child_1986: 那看看能不能在B表增加字段白
2 年多之前 回复
child_1986
child_1986 只有ID是标识哦,name可能会出现重复的
2 年多之前 回复
jiuqiyuliang
jiuqiyuliang 当然name需要唯一,不要然这样不行
2 年多之前 回复
gamefinity
gamefinity   Rxr 2015.06.03 10:02
  • 使用游标逐行插入。
  • 每插入一行,将原id和新id的对照记录到一个临时表中
  • 全部插入完以后,显示临时表
child_1986
child_1986 回复知常曰明: 谢谢,我再想想其他的方法
2 年多之前 回复
gamefinity
gamefinity 回复child_1986: 你要老的id,本来就不是一个标准的做法,当然采取的策略也不能用标准的策略啦。标准的做法就是把老的id放到另一个字段,如@于亮所说
2 年多之前 回复
child_1986
child_1986 回复知常曰明: 批量插入时用output这个想法呢,但只能输出新的ID,找不到老的ID
2 年多之前 回复
gamefinity
gamefinity 回复child_1986: 效率应该没有你想象的那么慢。因为两表的关联是保存到一个临时表里的,既没有索引,又没有历史数据。从B表读出是一样的,写到A表,用统一的一个事务的话也相差有限。千万别每个insert一个事务
2 年多之前 回复
child_1986
child_1986 表量很大,这样执行效率有些慢,有别的解决方案吗
2 年多之前 回复
datou431
datou431   Rxr 2015.06.18 15:45

你有另一个字段作为匹配,否则基本对不上,所以最好自己维护一个key

Csdn user default icon
上传中...
上传图片
插入图片