标识列SQL跳过零

时间:2018-03-21 06:50:53

标签: 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 (zero)。可以跳过这条记录吗?我的意思是,我不想拥有值为zero的ID。

请帮助。
谢谢。

2 个答案:

答案 0 :(得分:1)

这是对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似乎很荒谬。

答案 1 :(得分:0)

您可以使用触发器来控制...

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' d记录。