0

emp次の列を持つ名前のテーブルがあります。

id int (autoincrement), 
name varchar,
maxid int

idname、およびmaxidautoincrementmaxidの値を挿入したいid

以下の 2 つのクエリ オプションのうち、どちらが最適なオプションで、その理由は何ですか?

オプション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
select 'abc', IDENT_CURRENT('dbo.emp')

于 2013-04-16T13:09:12.403 に答える
2

上記のどれも更新の正しい実装ではありません。

しかし、あなたのシナリオによれば、私は2つのことをします。

最初に名前を挿入し、自動インクリメントを使用して ID を設定します。その後、まだ maxId を設定していないレコードを更新しません。

なぜこれを2段階で行うのですか?

データベースごとのインクリメンタル機能によって設定された MAX(id) と id の値とは異なる結果になる可能性があるため、オプション 1 を削除する必要があります。

使用できるクエリ。

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

しかし一方で、Serge の観察から、可能であればこの動作を完全に削除する必要があります。別の代替手段は、挿入後にキックするトリガーをクレートすることです。これの利点は、ビューまたは計算列の上で、この操作を 1 回だけ実行することです。

于 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 に答える