考虑以下表格和来自Microsoft's INSERT documentation的处理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
在这里工作,但有什么可行吗?是否有一个密钥令牌或函数表明应该使用标识列?
注意:我问的原因是我使用的框架要求在列列表中指定所有列。
答案 0 :(得分:4)
如果您使用的是SQL Server 2012及更高版本,则可以使用序列。但您必须先从Column1
删除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'
之后,您可以通过两种方式将数据插入表中:
{{1}}
答案 1 :(得分:1)
您可以在插入之前设置标识插入,然后设置标识插入
答案 2 :(得分:1)
除非为此表设置identity_insert(一次一个),否则不能为identity列设置值。一些例子:
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
错误
答案 3 :(得分:0)
我很确定使用SQL Server无法做到这一点。我能想到的两种解决方法:
如果库支持它,您可以创建一个视图并将其插入到该视图中。例如:
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')