自動インクリメントされない一意の主キーを持つテーブルに行を挿入したいと考えています。
最後のキーを評価してインクリメントするネイティブSQL関数はありますか、それとも2つのステップで行う必要がありますか?
key = select max(primary.key) + 1
INSERT INTO dbo.TABLE (primary.key, field1, fiels2) VALUES (KEY, value1, value2)
自動インクリメントされない一意の主キーを持つテーブルに行を挿入したいと考えています。
最後のキーを評価してインクリメントするネイティブSQL関数はありますか、それとも2つのステップで行う必要がありますか?
key = select max(primary.key) + 1
INSERT INTO dbo.TABLE (primary.key, field1, fiels2) VALUES (KEY, value1, value2)
自動生成されるため、提供しないでください。
INSERT INTO bo.TABLE (field1, fiels2) VALUES (value1, value2)
更新:列が列の場合に機能しIDENTITY
ます。
ID 列に明示的な値を提供するには、次のようにする必要があります。
set identity_insert bo.TABLE on
INSERT INTO bo.TABLE (primary_key, field1, fiels2) VALUES ((SELECT ISNULL(MAX(id) + 1, 0) FROM bo.Table), value1, value2)
set identity_insert bo.TABLE off
しかし、このようにする説得力のある理由はありません。
全体のコメントから判断すると、テーブルに ID 列ではない主キーがあります。
SQL Server のバージョンが SQL 2012 の場合は、シーケンスを調べる必要があります: http://msdn.microsoft.com/en-us/library/ff878091.aspx
他のバージョンでは、主キー列の IDENTITY プロパティ (http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80).aspx) を使用してテーブルを再作成するか、二段階アプローチ。
2 段階のアプローチを使用する場合は、同時に実行されている挿入が同じ新しい値を使用しないようにする必要があります。これを行う最も簡単な方法は、select と insert を 1 つの値に結合し、シリアライズ可能なテーブル ヒントを使用することです。
CREATE TABLE dbo.Tbl1(id INT PRIMARY KEY, val1 INT, val2 INT)
INSERT INTO dbo.Tbl1(id, val1, val2)
VALUES((SELECT ISNULL(MAX(id)+1,0) FROM dbo.Tbl1 WITH(SERIALIZABLE, UPDLOCK)), 42, 47);
SELECT * FROM dbo.Tbl1;
私の意見では、最良の答えは、PK 列が ID 列になるようにテーブルを修正することです。(現在選択されている回答が最適でない理由については、Sebastian Meine からの回答に対する私のコメントを参照してください。) 既存の PK を ID 列にする唯一の方法は、テーブルを交換することです。だいたい:
BEGIN TRAN;
-- Rename all constraints in original table
EXEC sp_rename 'dbo.YourOriginalTable.PK_ConstraintName', 'PKConstraint_Backup';
EXEC sp_rename 'dbo.YourOriginalTable.OtherConstraintName', 'OtherConstraintName_Backup';
CREATE TABLE dbo.WorkTable (
YourPKColumn int identity(1, 1) NOT NULL -- your PK converted to identity
CONSTRAINT PK_YourOriginalTableConstraintName PRIMARY KEY CLUSTERED,
AllOtherColumns -- all your other columns exactly as in the original table
);
SET IDENTITY_INSERT dbo.WorkTable ON;
INSERT dbo.WorkTable (YourPKColumn, AllOtherColumns)
SELECT YourPKColumn, AllOtherColumns
FROM dbo.YourOriginalTable WITH (TABLOCKX, HOLDLOCK);
SET IDENTITY_INSERT dbo.WorkTable OFF;
-- Drop all FK constraints from other tables pointing to your table
ALTER TABLE dbo.TableWithFK_1
DROP CONSTRAINT FK_TableWithFK_1_YourOriginalTableSomethingID;
-- Swap out the tables
EXEC sp_rename 'dbo.YourOriginalTable', 'YourOriginalTableBackup';
EXEC sp_rename 'dbo.WorkTable', 'YourOriginalTable';
-- If you didn't add them in the WorkTable creation,
-- add all other removed or needed constraints creation
ALTER TABLE dbo.YourOriginalTable
ADD CONSTRAINT OriginalConstraint (OriginalConstraintColumns);
-- Add back FK constraints from other tables to this one.
COMMIT TRAN;
これで、クラスター化された PK を持つ ID 列を持つテーブルができました。問題なく挿入できます。並行性の問題や、簡単に間違われるSELECT Max() + 1
愚かながらくたはもうありません。
存在しない場合はテーブルを作成 Emp ( eid int(10) NULL でない主キー auto_increment、名前 varchar(45) NULL でない、年齢 int(5) デフォルト 20、給与 int(5) ) emp 値に挿入(102,'Ranjan' ,21,450000);
次に、以下の sql query を試してください。eidを次の番号に自動的にインクリメントします。
emp (name,salary) 値に挿入します( 'Lisma',118500);
emp から * を選択します。