首页 新闻 会员 周边 捐助

Sql Server 批量导入数据主键重复问题

0
悬赏园豆:30 [已解决问题] 解决于 2012-11-27 17:26

使用Sql Server 批量导入数据时,出现主键重复问题。就是元数据【表1】的id和导入目标【表2】的id主键重复,怎么把【表1】数据导入到【表2】中?【表1】的id在【表2】中自增。

 

各位大侠帮帮忙,真的很着急,谢谢。

陀螺-的主页 陀螺- | 初学一级 | 园豆:74
提问于:2012-11-24 14:09
< >
分享
最佳答案
0

insert into 表2(除ID外的所有字段名)SELECT  除ID外的所有字段名 FROM 表1

收获园豆:10
I,Robot | 大侠五级 |园豆:9783 | 2012-11-24 18:53

这种方法不错。

insert into weibo_Transpond
([Weibo_id]
      ,[user_id]
      ,[user_link]
      ,[Transpond_url]
      ,[Transpond_Author]
 
select 
[Weibo_id]
      ,[user_id]
      ,[user_link]
      ,[Transpond_url]
      ,[Transpond_Author]
 
 from weibo_Transpond_new with(nolock)
where not exists
(
select 1 from weibo_Transpond with(nolock) where weibo_Transpond.Transpond_Id=weibo_Transpond_new.Transpond_Id
)
陀螺- | 园豆:74 (初学一级) | 2012-11-27 17:23
其他回答(5)
0

先新建第3张表,然后把1表和2表除去主键以外的都导入过去,这样的话就自动的生成所有的主键(第3张表中)这个时候,你可以把第3张表当做第2张表了

收获园豆:5
chenping2008 | 园豆:9836 (大侠五级) | 2012-11-24 14:11

这样会有问题吧,如果先导表1 的数据,导表2的数据时还会出现,主键重复吧。

这和我直接从表1导入表2 一样。 

支持(0) 反对(0) 陀螺- | 园豆:74 (初学一级) | 2012-11-24 14:14

@t-h: 第三表的主键是自增的,导入表1,表2的时候,主键是不导入的。这样表3就是需要的表了。

其实,你直接从表1导入到表2就行了。表1的主键不导入。

支持(0) 反对(0) 仰望繁星的猪 | 园豆:519 (小虾三级) | 2012-11-24 22:37
0

表1的id还保留吗?不保留的话导入的时候不导入这一列不就行了

飞来飞去 | 园豆:2057 (老鸟四级) | 2012-11-24 16:11
0

首先:要确保表2的表结构,表2中设置id那一列的是自增的,其他字段与表1的其他字段的类型,长度,约束都一样。

第二:将表1的除了ID那一列的其他数据导入。

上面说的方法表2的ID 和 表1 的ID可能不一样。还有一种办法,表2 是一个空的结构,没有设置主键。把表1的数据全部导进去以后,在设置主键。

收获园豆:5
jone_e | 园豆:1410 (小虾三级) | 2012-11-24 20:45
0

table2 的ID 不是自动增长的吧。

先用 row_number() 查询出每行的序号 rowid。在查出 table2 最大的 ID

导入时 insert into table2(id) select ID+rowid from table

收获园豆:5
geass.. | 园豆:1821 (小虾三级) | 2012-11-25 20:16
0

如果你的ID是自动增长列的话,你可以尝试用这个种方法来进行:

drop database testBase
create database testBase

create table test
(
 ID int primary key identity(1,1),
 name nvarchar(20)
)

declare @i int
declare @name nvarchar(20)
set @i =1
while(@i<10)
Begin
  set @name ='Code-'+CONVERT(nvarchar, @i)
  insert into test(name)values(@name)
  set @i=@i+1
end

select * from test

select * into test2 from test

select * from test2

declare @i int
set @i =1
while(@i<10)
Begin
  if(@i%2<>0)
 begin
  delete from test2 where  ID = @i
 end
  set @i=@i+1
end

select * from test2 order by name

insert into test2 (name) select name from test

select * from test2 order by name

收获园豆:5
猥琐的疯子 | 园豆:142 (初学一级) | 2012-11-26 12:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册