SQL Serverのテーブルで、null以外のintとして定義されているserial_no
列を処理しています。それは私の挿入ステートメントからその列を残しているかのように、自動的にインクリメントするフィールドではないようです。serial_no
フィールドをnullにすることはできないというエラーが表示されます。SQLサーバー:次の使用可能なintを挿入します。
どのようにして次の番号を挿入しますか?
私はこの試みた:
INSERT INTO mytable (serial_no) VALUES ((SELECT MAX(serial_no)+1 FROM mytable))
を私はサブクエリはこの文脈で使用することができないというエラーを取得します。
EDIT:この表はオフ・シェルフ製品で使用されているので、デザインを変更してserial_no列を自動インクリメントにすることはできません。
すべての行で一意でなければなりませんか?回答における推奨されるアプローチは、通常並行性安全ではありません。あなたは重複してしまうかもしれません.....あなたはどちらかをa)INT IDENTITY列にしてSQL Serverにそれを心配させる必要があります。b)obviuosよりもはるかに多くの作業を行います。SELECT MAX(serial_no)+ 1 "、またはc)SQL Server 2011を待って、それが' SEQUENCES'のコンセプトを使用する –
marc_s、私は全く同意しますが、残念ながらDBデザインを変更することはできません。テーブルをロックして挿入してロックを解除するとどうなりますか?それが偽薬を作ることからそれを保護するだろうか?または待機中のクエリはロックが解放されるのを待ってから、とにかく#を挿入するでしょうか? –
サードパーティ製アプリケーションがどのように値を作成し、同じように行うかを決定するためにトレースを実行できますか? ID列がない場合は、次の値を保持するためにテーブルを使用する可能性が高いと言います。この手法についてはすでに言及されている回答があります。 –