将字段设置为与插入中的ID(IDENTITY)相同

时间:2011-04-20 06:17:51

标签: sql-server sql-server-2008 identity

我的表中有一个Code(int),ID设置为identity。如何设置我的代码的默认值以使用相同的值az ID填充?我的意思是身份。

6 个答案:

答案 0 :(得分:2)

如果它总是具有相同的值 - 为什么不放弃该字段。否则,可以使用触发器维护(BEFORE INSERT一个)。

答案 1 :(得分:2)

您可以使用after insert触发器:

create table TestTable (id int identity, col1 int)
go
create trigger TestTrigger on TestTable after insert
    as begin
    update  TestTable 
    set     col1 = id
    where   col1 is null
            and id in (select id from inserted)
    end
go

测试代码:

insert TestTable default values
insert TestTable (col1) values (666)
insert TestTable default values
select * from TestTable

一般来说,我试图避开触发器。从长远来看,使用存储过程进行插入更加可维护:

create procedure dbo.InsertTestRow(
    @col1 int)
as
insert  TestTable (col1) values (@col1)

if @col1 is null
    begin
    update  TestTable
    set     col1 = id
    where   id = SCOPE_IDENTITY()
    end

答案 2 :(得分:1)

  

我正在找东西   默认值!如果它为null它应该   填充与id相同的值   但如果它提供了一些价值,   它应该保持这个价值

您可以在查询中使用coalesce来解决问题。

create table T (ID int identity, ID2 int)

insert into T values (default)
insert into T values (null)
insert into T values (78)

select
  ID, 
  coalesce(ID2, ID) as ID2
from T

结果

ID  ID2
--  ---
1   1
2   2
3   78

答案 3 :(得分:1)

假设您的表的ID是Identity列,您可以考虑使用约束:

ALTER TABLE MyTable
ADD CONSTRAINT MyTableCodeDefault
DEFAULT IDENT_CURRENT('MyTable') FOR Code

这适用于这些用例:

INSERT INTO MyTable DEFAULT VALUES
INSERT INTO MyTable ({columns NOT including 'Code'}) 
  VALUES ({value list matching insert columns})
INSERT INTO MyTable (Code) VALUES (666)
INSERT INTO MyTable (Code) SELECT 8 UNION SELECT 13 UNION SELECT 21

但批量插入无效

INSERT INTO MyTable ({columns NOT including 'Code'})
SELECT {value list matching insert columns}
UNION 
SELECT {value list matching insert columns}
UNION
SELECT {value list matching insert columns}

这种限制可能看起来很麻烦,但根据我的实际经验,这很少是一个问题。我遇到的大多数需要默认值的用例涉及用户/ UI“方便”:如果用户不愿意,请不要强制用户选择值。

OTOH,我很少遇到批量插入情况,因为指定要定位的列的值是不切实际的。

答案 4 :(得分:0)

您可以使用计算列,如下所示:

if object_id('TempTable') is not null drop table TempTable
create table TempTable (Id int identity(1,1), Code as Id)

insert into TempTable
default values

insert into TempTable
default values

insert into TempTable
default values

select * from TempTable

当然,如果您有其他列,那么您不需要default values

if object_id('TempTable') is not null drop table TempTable
create table TempTable (Id int identity(1,1), Code as Id, SomethingElse int)

insert into TempTable (SomethingElse)
select 10 union all
select 11 union all
select 12

select * from TempTable

但是,就像zerkms所说 - 为什么你需要两个相同的列呢?

答案 5 :(得分:-1)

如果该字段是SQL Server中的标识字段,则数据库引擎将处理其值。我们通常做的是读取记录(插入后)以获取生成的Id。

编辑:听起来你正试图“覆盖”身份?如果是这样,在插入之前,运行:

SET IDENTITY_INSERT [tableName] ON

您必须小心不要插入已存在的值。不过,这可能会变得棘手。那么可以考虑完全删除identity属性,并自己管理默认值?