[英]Specify “NEXT VALUE” for INSERT statement using identity column in SQL Server
考虑下表和Microsoft的INSERT文档中涉及IDENTITY列的SQL:
CREATE TABLE dbo.T1 (column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 (column_2) VALUES ('Row #2');
INSERT
语句未将column_1
指定为表的列,并且SQL Server自动为该标识列填充下一个值。 这是标识列的正常处理方式。
在指定列名的同时,如何具有相同的行为?
例如,我正在寻找类似的东西 :
INSERT INTO T1 (column_1, column_2)
VALUES (NEXT VALUE, 'Row #3');
GO
我不相信NEXT VALUE
在这里NEXT VALUE
,但是有什么有用的吗? 是否有密钥令牌或功能将指示应使用标识列?
注意:我问的原因是我正在使用的框架要求在列列表中指定所有列。
如果您使用的是SQL Server 2012及更高版本,则可以使用序列。 但是您必须首先从Column1
删除IDENTITY
属性。 这只能通过复制并重命名新表来完成。
CREATE SEQUENCE Column1_Sequence
AS int
START WITH 0;
CREATE TABLE T1
(
Column1 int DEFAULT (NEXT VALUE FOR Column1_Sequence) PRIMARY KEY
, Column2 nvarchar(30)
)
之后,您可以通过两种方式将数据插入表中:
INSERT INTO T1 (Column1, Column2)
SELECT NEXT VALUE FOR Column1_Sequence
, 'Row #2'
INSERT INTO T1 (Column2)
SELECT 'Hello world'
您能否在插入之前先打开身份插入,然后再将身份插入关闭
除非您为此表设置了identity_insert(一次为一个),否则您无法为标识列设置值。 一些例子:
create table #tmp (id int identity(1,1), name varchar(10))
insert #tmp (id,name) values (2,'test')
--error Cannot insert explicit value for identity column in table '#tmp
set identity_insert #tmp on --for one table in DB
insert #tmp (id,name) values (2,'qwas')
select * from #tmp
set identity_insert #tmp off -- good practice
--works
--see current identity value
SELECT IDENT_CURRENT ('#tmp') AS Current_Identity;
--Reset identity value
DBCC CHECKIDENT (#tmp, RESEED, 999)
--next insert will be 1000
当然,如果将下一个身份重置为与PK(身份的常规用法)相冲突的值,则将出现Violation of PRIMARY KEY constraint
错误的情况
我敢肯定,SQL Server无法做到这一点。 我能想到的两种解决方法:
如果库支持,则可以创建视图并在其中插入INSERT。 例如:
CREATE TABLE MyTable ( ID INT IDENTITY(1, 1), SomeColumn VARCHAR(100) ) GO CREATE VIEW MyTableView AS SELECT SomeColumn FROM MyTable GO INSERT INTO MyTableView (SomeColumn) VALUES ('Test')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.