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

|| 我的表中有一个代码(int),该ID设置为identity。如何为我的代码设置默认值,使其由相同的值az ID填充?我的意思是身份。
已邀请:
您可以使用“ 0”触发器:
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
如果它始终具有相同的值-为什么不删除该字段。否则,可以使用触发器进行维护(ѭ4maintained 1)。
我正在寻找东西 默认值!如果为null,则应该 用与id相同的值填充 但是如果它具有某些价值, 它应该保持那个价值 您可以通过在查询中使用合并来解决此问题。
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
假设表的ID是“身份”列,则可以考虑使用约束:
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,我很少遇到批量插入的情况,在这种情况下很难为要定位的列指定值。
您可以使用计算列,如下所示:
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所说的那样-为什么您需要两个相同的列?
如果该字段是SQL Server中的“身份”字段,则数据库引擎将处理其值。我们通常要做的是回读记录(在插入之后)以获取生成的ID。 编辑:听起来您正在尝试“覆盖”身份?如果是这样,请在插入之前运行:
SET IDENTITY_INSERT [tableName] ON
您必须注意不要插入已经存在的值。但是,这可能会很棘手。因此,也许考虑完全删除identity属性,然后自己管理默认值?

要回复问题请先登录注册