如何将自动增量键插入SQL Server表

时间:2012-12-21 17:41:30

标签: sql sql-server

我想将行插入到具有唯一的非自动递增主键的表中。

是否有本机SQL函数来评估最后一个密钥并增加它,或者我必须分两步完成:

key = select max(primary.key) + 1

INSERT INTO dbo.TABLE (primary.key, field1, fiels2) VALUES (KEY, value1, value2)

4 个答案:

答案 0 :(得分:21)

由于它是自动生成的,根本就没有提供它:

INSERT INTO bo.TABLE (field1, fiels2) VALUES (value1, value2)

更新:如果您的专栏是IDENTITY列,那将会有效。

要为标识列提供显式值,您必须执行以下操作:

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

但这样做并没有令人信服的理由。

答案 1 :(得分:13)

从整个评论来看,你在桌子上有一个不是标识栏的主键。

如果您的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)重新创建表或使用两步法。

如果采用两步法,则需要确保同时运行的插入不会最终使用相同的新值。最简单的方法是将select和insert插入一个值并使用serializable表提示:

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;

答案 2 :(得分:4)

在我看来,最好的答案是修复你的表,以便PK列是一个标识列。 (请参阅我对Sebastian Meine关于您当前选择的答案不是最好的答案的评论。)使现有PK成为标识列的唯一方法是交换表格。大致是:

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的标识列。你可以插入它没问题。没有更多的并发问题和愚蠢的SELECT Max() + 1垃圾,容易出错

答案 3 :(得分:0)

创建表格如果不存在Emp (   eid int(10)not null主键auto_increment,   name varchar(45)not null,   age int(5)默认为20,   工资int(5) ) 插入emp值(102,' Ranjan',21,450000);

然后尝试下面的SQL查询。它会自动将 eid 增加到下一个数字。

插入emp(姓名,工资)值(' Lisma',118500);

从emp中选择*;