0

我有一个用以emp下列命名的表:

id int (autoincrement), 
name varchar,
maxid int

我想插入id,name和autoincrement 的maxid值。maxidid

在以下两个查询选项中,哪一个是最佳选项,为什么?

选项1:

insert into emp (name,maxid) values ('abc',(select max(id)+1 from emp))

选项2:

string QRY = "insert into emp values('abc',0) select scope_identity()";
sqlcommand cmd= new sqlcommand(QRY, con);
datatable dt = new datatable();
con.open();
dt.load(cmd.executereader());  
con.close();
int scopeid=int.parse(dt.rows[0][0].tostring());

QRY="update emp set maxid='"+scopeid+"' where id ='"+scopeid+"'";
cmd= new sqlcommand(QRY, con);
cmd.executenonquery();
4

4 回答 4

2

简单的 演示方法在这里

插入 dbo.emp
选择 'abc', IDENT_CURRENT('dbo.emp')

于 2013-04-16T13:09:12.403 回答
2

以上都不是更新的正确实现。

但根据你的情况,我会做两件事。

首先插入名称并使用自动增量设置id,然后执行更新那些尚未设置maxId的记录。

为什么要分两个阶段进行?

我们可能会得到与 MAX(id) 不同的结果和数据库增量特征设置的 id 值,因此必须删除选项 1。

可以使用的查询。

insert into emp (name) values ('abc')
update emp set maxid = id where maxid is null;

但是从另一方面和 Serge 的观察来看,如果可能的话,你应该完全放弃这种行为。另一种选择是创建一个在插入后触发的触发器。这样做的好处是上面的视图或计算列是您只执行一次此操作。

于 2013-04-16T12:33:05.007 回答
1

我宁愿用INSERT INTO...SELECT语句,

INSERT INTO emp (name, maxid) 
SELECT 'abc', COALESCE(MAX(id), 0) + 1 
FROM   emp
于 2013-04-16T12:30:02.167 回答
1

Select max(id)+1可能与自动增量 ID 不同,因此该选项无效。

至于第二个选项,它仍然是不必要的复杂性。您可以使用 maxid NULL 插入,然后更新为 id

insert into emp (name,maxid) values ('abc',NULL)

update emp set maxid = id where maxid is null
于 2013-04-16T12:39:43.030 回答