怎样用SQL向数据库中update批量更新数据库的插入数据,主键是随机生成的

向数据库插入数据后返回新插入行的主键
向插入数据后返回新插入行的主键
在开发的时候,大家可能也遇见过下面类似的问题。
场景说明:
存在表1,表2两张表,两表满足以下条件:
表1 的主键为表2的外键
表1的主键为自动编号,所以在插入数据时,会自增,无需人为干预
现在,想进行如下操作:
向表1插入1条新纪录,同时需要向表2插入多条新记录,表2中插入记录的外键为表1新插入记录的主键
问题解析:
因为表1的主键为自动编号,所以向表1插入新纪录的过程中,我们程序员是不知道表1新插入这条记录的主键的,因为这个往往不需要我们关注。但是向表2插入新记录时,这个主键又是必须要获取到的,那我们该怎么办呢
可以采用下面的方法:
NSERT INTO tableName (fieldname ...) values (value ...) SELECT @@IDENTITY AS returnN
创建表tb_Class及表tb_Student。tb_Class的主键为classid,自动编号。tb_Student的外键classid与tb_Class表的主键classid对应。
CREATE TABLE [dbo].[tb_Class](
[classid] [int] IDENTITY(1,1) NOT NULL,
[classname] [nchar](10) NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[tb_Student](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NOT NULL,
[age] [int] NOT NULL,
[classid] [int] NULL,
CONSTRAINT [PK_tb_Student] PRIMARY KEY CLUSTERED
)WITH (PAD_INDEX
= OFF, STATISTICS_NORECOMPUTE
= OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS
= ON) ON [PRIMARY]
) ON [PRIMARY]
插入数据操作:
DECLARE @classId AS INT;
INSERT INTO tb_Class(classname) VALUES ('1班') SELECT @classId=@@IDENTITY;
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana0',20,@classId);
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana1',18,@classId);
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana2',21,@classId);
SELECT * FROM tb_C
SELECT * FROM tb_S
插入两次后的结果为:
好了,88。所有回答(2)
自己解决了,
INSERT INTO userinfo([username],[password],[email])
SELECT * FROM OPENROWSET(
BULK 'D:/user.txt',
FORMATFILE='d:/BCPFORMAT.xml'
FIRSTROW=2
参考其中的sql server 2005的解决方法。但是感觉这已经不是BULK INSERT了啊,不知道效率是否跟BULK INSERT一样
BULK INSERT userinfo
FROM 'd:\user.txt'
KEEPIDENTITY,
FORMATFILE='c:\BCPFORMAT.Xml',
fieldterminator='#',
rowterminator='\n'
园豆:3592
指定了需要插入的列,就是不知道bulk insert有没有指定插入列的功能
&&&您需要以后才能回答,未注册用户请先。其他回答(5)
先新建第3张表,然后把1表和2表除去主键以外的都导入过去,这样的话就自动的生成所有的主键(第3张表中)这个时候,你可以把第3张表当做第2张表了
收获园豆:5
园豆:9726
表1的id还保留吗?不保留的话导入的时候不导入这一列不就行了
园豆:2017
首先:要确保表2的表结构,表2中设置id那一列的是自增的,其他字段与表1的其他字段的类型,长度,约束都一样。
第二:将表1的除了ID那一列的其他数据导入。
上面说的方法表2的ID 和 表1 的ID可能不一样。还有一种办法,表2 是一个空的结构,没有设置主键。把表1的数据全部导进去以后,在设置主键。
收获园豆:5
园豆:1410
table2 的ID 不是自动增长的吧。
先用 row_number() 查询出每行的序号 rowid。在查出 table2 最大的 ID
导入时 insert into table2(id) select ID+rowid from table
收获园豆:5
园豆:1887
如果你的ID是自动增长列的话,你可以尝试用这个种方法来进行:
drop database testBasecreate database testBase
create table test(&ID int primary key identity(1,1),&name nvarchar(20))
declare @i intdeclare @name nvarchar(20)set @i =1while(@i&10)Begin& set @name ='Code-'+CONVERT(nvarchar, @i)& insert into test(name)values(@name)& set @i=@i+1end
select * from test
select * into test2 from test
select * from test2
declare @i intset @i =1while(@i&10)Begin& if(@i%2&&0)&begin&&delete from test2 where& ID = @i&end& set @i=@i+1end
select * from test2 order by name
insert into test2 (name) select name from test
select * from test2 order by name
收获园豆:5
&&&您需要以后才能回答,未注册用户请先。2. Oracle数据运用那种主键生成策略,至少5种
主键由外部程序负责生成,无需Hibernate参与。
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequee中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.sing
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
这10中生成OID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,但是数据库必须支持自动增长,当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择用native 让Hibernate来帮选择identity,sequence,或hilo.
另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex
作为主键生成机制
本文已收录于以下专栏:
相关文章推荐
Oracle数据库采用那种主键生成策略
1、自动增长identity:
适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标...
有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。
一、自增长主键
--首先建一个表TEST
create table TEST
  NID int PRIMARY KE...
oracle主键       两种方法:自增主键sequence,SYS_GUID()生成唯一序列。       一、自增主键       ...
Hibernate面试题 --- Hibernate主键的生成策略(Oracle数据运用那种主键生成策略)
Hibernate主键的生成策略
      
     &#1...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDB...
2. Oracle数据运用那种主键生成策略,至少5种
1) assigned
主键由外部程序负责生成,无需Hibernate参与。
通过hi/lo 算法实现的主键生成机...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDB...
Hibernate主键的生成策略
&Customers& table=&customers&&
       &id& column=&id&&...
有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。
一、自增长主键
--首先建一个表TEST
create table TEST
  NID int PRIMARY KE...
Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence机制来实现主键的自增的话. MySQL中需要使用TableGener...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 批量导入数据库 的文章

 

随机推荐