标识列SQL跳过零

标识列SQL跳过零,sql,sql-server-2012,Sql,Sql Server 2012,我有下表: CREATE TABLE [T_Manufacture]( [ManufactureID] [int] IDENTITY(-2147483648,1) NOT NULL, [Manufacture] [varchar](25) NULL, [ManufactureDescription] [varchar](50) NULL) 我们可以看到,ManufactureID是标识列,它从-2147483648开始。因此,如果标识达到-1,那么下一条记录应该是0(零)。是否可以跳过此记录?

我有下表:

CREATE TABLE [T_Manufacture](
[ManufactureID] [int] IDENTITY(-2147483648,1) NOT NULL,
[Manufacture] [varchar](25) NULL,
[ManufactureDescription] [varchar](50) NULL)
我们可以看到,
ManufactureID
是标识列,它从
-2147483648
开始。因此,如果标识达到-1,那么下一条记录应该是
0(零)
。是否可以跳过此记录?我的意思是,我不想有一个值为零的ID

请帮忙。

谢谢。

你可以用触发器控制它

CREATE TRIGGER SkipZeroManufacture ON T_Manufacture AFTER INSERT
AS
BEGIN

    IF EXISTS (SELECT 'zero record inserted' FROM inserted AS I WHERE I.ManufactureID = 0)
    BEGIN

        INSERT INTO T_Manufacture (
            Manufacture,
            ManufactureDescription)
        SELECT
            I.Manufacture,
            I.ManufactureDescription
        FROM
            inserted AS I
        WHERE
            i.ManufactureID = 0

        DELETE T_Manufacture WHERE ManufactureID = 0

    END

END

虽然这是一个糟糕的想法,因为它将在每次插入时触发,但只检查一个值,并且需要维护新的或更新的列。它还将用另一个ID切换0 ID的记录。

这是对Deepak评论的详细说明

为什么会有人在id列中使用负数?而且,如果您担心有20亿个值,那么您应该关心40亿个值,并使用
bigint

CREATE TABLE T_Manufacture (
    ManufactureID bigint IDENTITY(1, 1) PRIMARY KEY,  -- might as well declare it
    Manufacture varchar(25),
    ManufactureDescription varchar(50)
);
这是解决问题的最简单方法,可以确保表可以按您想要的大小增长

换句话说,“跳过”特定值的正确方法是在该值之后启动标识枚举。或者,如果你真的想:

CREATE TABLE T_Manufacture (
    ManufactureID int IDENTITY(-1, -1) PRIMARY KEY,  -- might as well declare it
    Manufacture varchar(25),
    ManufactureDescription varchar(50)
);

但再一次,否定ID看起来很荒谬。

有什么具体的原因让你开始使用ID作为
-ve
?如果您想要一组大的ID,而不是
int
,您可以使用
bigint
Agree,我可以使用
bigint
来处理一组大的数据。没有具体的原因,但我们知道
int
的最小值是-2147483648。是的,关于
int
的最小值这一事实,你是对的,但问题是当你有一个正确和适当的方法时,为什么要让它变得棘手?嗯,这并不棘手。这让我好奇。如果没有关于如何跳过零值的答案,那么我将使用
bigint
作为解决方案。如果您的代码已经被设计为可以处理间歇性错误并执行重试,那么您只需向表中添加一个
CHECK
约束,该约束不允许零值,并强制执行重试。由于标识不与事务交互,因此尝试使用它仍会导致标识值的增量超过0。您好,感谢您的回答,,,但“每次插入时触发”似乎不是一个好主意。不管怎么说,这种方法非常棘手……:)