INSERT语句中的主键的棘手问题

时间:2019-08-17 21:28:45

标签: sql sql-server

我在SQL Server数据库中具有自动递增主键[ID]的表。有什么方法可以在[ID]语句中包含INSERT列,以便数据库将其忽略?表配置有一些技巧吗?

我不在Omron NJ PLC上的PC上工作,所以我自己不能写语句。而是从Structs映射它们。并且,如果可能的话,我想对INSERTSELECT使用相同的结构(在以后的[ID]中我需要UPDATE)。我也不想自己生成索引。虽然邪恶程度较小。

2 个答案:

答案 0 :(得分:1)

在SQL Server中,您需要为插入的列提供一个值。有一个名为DEFAULT的特殊值,它将插入默认值。但是,它不能与IDENTITY列一起使用。

通常的insert方法是简单地忽略该列:

insert into t (<all columns but id>)
    values (<all values for other columns>);

即使表上的触发器也无法解决此限制,但是您可以使用以下技巧:

  • 在表上创建一个视图,选择所有列。
  • 在表上创建一个instead of insert触发器。
  • 插入视图而不是

这看起来像:

create view v_t as
    select * from t;

create trigger trig_v on v_t instead of insert as
begin
    insert into t ( . . . )  -- all columns except id
        select . . .         -- all columns except id
        from inserted;
end;

insert into v_t -- I recommend listing the columns but not required
    values (NULL, . . . );

Here是db <>小提琴。

答案 1 :(得分:1)

如果要在标识上插入ID的显式值,可以在插入之前使用SET INSERT_IDENTITY ON语句。之后,您将通过语句SET INSERT_IDENTITY OFF再次启用身份。

希望这会有所帮助。