2016-04-11 11 views
0

アイテムテーブルに@id値を自動インクリメントとして挿入したいとします。SQLサーバークエリでテーブルに変数(@id)を自動インクリメントとして挿入する方法はありますか?

表名=項目 列=コード、名前。

列のコードはnull値を許可せず、一意ですが、自動インクリメントはありません。 コードの列に値(1,2,3,4、...)を埋め込むクエリを書き込もうとしました。自動インクリメントが、それはこれはこれはエラー

メッセージ515、レベル16、状態2である私のクエリ

DECLARE @id INT 
SET @id = (select MAX(Code) from Items) 

SET @id [email protected]+1 

insert into Items (Code,Name) values(@id,'m') 

ある

機能しない、ライン6 'の列にNULL値を挿入することはできませんコード '、テーブル'アイテム ';列はNULLを許可しません。 INSERTは失敗します。 ステートメントが終了しました。

コードの列に@idを自動インクリメントとして挿入します。

誰でも教えてください。

+0

どのようなデータベースをお使いですか? – jamiedanq

答えて

1

あなたのテーブルは空であると見なすことはできますか?この場合

SET @id = (select MAX(Code) from Items) 

ので

SET @id [email protected]+1 

もヌルである、

NULLです。

正しいコードは次のようになります。行がない場合に0の数値を返します

SET @id = (select ISNULL(MAX(Code),0) from Items) 

一般的な初心者のSQLエラー - SQLのNULLの「有害な」性質に注意してください。あなたはリスク@Idあなたが使用している場合は、以下のお取引

insert into Items (Code, Name) 
select MAX(Code) + 1, 'm' 
    from items 

でそれをラップする必要はありません1文があると私はこれが扱っ思いますので

+0

選択と挿入の間にMAX(コード)/ @idのリスクがあります。 – Paparazzi

+0

はい、いいえ。この質問はロックに関するものではありません。これは問題ではないシナリオが数多くあります。シリアライザブル・ロック下で実行されるコードから、単一スレッドのETLプロセスで実行をコード化するコードまでです。私はOPがサイトのルールを知っていると仮定して、質問された質問に答えました(複製するための最小限のサンプルコードを提供し、他のすべての要素を無視します)。 – TomTom

+0

そして、そこに問題のあるシナリオが*トン*あります。 OPの基本スコアは8ですが、サイトルールとロッキングを理解しているとしますか? – Paparazzi

0

は、それが二つの文の間

を変更しました空のアイテム

insert into Items (Code, Name) 
select isnull(MAX(Code), 0) + 1, 'm' 
    from items