Sql server 如果达到标识列的最大值,将附加什么?

Sql server 如果达到标识列的最大值,将附加什么?,sql-server,Sql Server,可能重复: 如果SQL server表的标识列(表示int)达到int的最大容量,那么会追加什么 回到开始 假设直线的长度为100乘以100。每次插入100行新行时,都会删除100行旧行 谢谢你的回答 致以最诚挚的问候它将不允许您插入更多的行。当您超过最大int值时,将出现算术溢出错误 试试看: DECLARE @t TABLE ( id INT IDENTITY (2147483647,1), name VARCHAR(100) ) INSERT INTO @t (na

可能重复:

如果SQL server表的标识列(表示int)达到int的最大容量,那么会追加什么

回到开始

假设直线的长度为100乘以100。每次插入100行新行时,都会删除100行旧行

谢谢你的回答
致以最诚挚的问候

它将不允许您插入更多的行。

当您超过最大int值时,将出现算术溢出错误

试试看:

DECLARE @t TABLE (
    id INT IDENTITY (2147483647,1), 
    name VARCHAR(100)
)


INSERT INTO @t (name) VALUES ('Joe')  
INSERT INTO @t (name) VALUES ('Tim')

我不知道的是,无论本地标识字段定义为什么,标识函数(、和)都返回一个十进制(38,0)值

正如其他人所指出的,错误消息的性质相同 将标识转换为数据类型X时出现算术溢出错误

当你问关于SQL Server的问题时,我的恐怖故事是MySQL 4.trash是一个旧工作中的遗留应用程序,它在tinyint上定义了一个标识。当溢出时,它没有爆炸,只是不断插入具有相同id的行(我知道,PK应该阻止它,但它是一个非常糟糕的db设计)

@Joe Stefanelli已经提供了一个生成错误的框架,但是为了我自己的教育,我把它吹了出来,以涵盖bigint和decimal

SET NOCOUNT ON

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim' AND SCHEMA_NAME(t.schema_id) = 'dbo')
BEGIN
    DROP TABLE dbo.Tim
END

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim_decimal' AND SCHEMA_NAME(t.schema_id) = 'dbo')
BEGIN
    DROP TABLE dbo.Tim_decimal
END

IF EXISTS (select 1 from sys.tables T WHERE T.name = 'Tim_bigint' AND SCHEMA_NAME(t.schema_id) = 'dbo')
BEGIN
    DROP TABLE dbo.Tim_bigint
END    
-- http://msdn.microsoft.com/en-us/library/ms187342.aspx

CREATE TABLE 
    dbo.Tim
(
    tim_id int identity(2147483646 , 1) NOT NULL PRIMARY KEY
,   val int 
)

BEGIN TRY
    -- consumes the first value
    INSERT INTO
        dbo.Tim
    SELECT
        0 AS number

    SELECT SCOPE_IDENTITY() AS last_int_identity

    -- this insert brings us to the edge

    INSERT INTO
        dbo.Tim
    SELECT
        1 AS number

    SELECT SCOPE_IDENTITY() AS last_int_identity

    -- This one goes kaboom
    --Msg 8115, Level 16, State 1, Line 27
    --Arithmetic overflow error converting IDENTITY to data type int.
    INSERT INTO
        dbo.Tim
    SELECT
        -1 AS number
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
    ,   ERROR_SEVERITY() AS ErrorSeverity
    ,   ERROR_STATE() AS ErrorState
    ,   ERROR_PROCEDURE() AS ErrorProcedure
    ,   ERROR_LINE() AS ErrorLine
    ,   ERROR_MESSAGE() AS ErrorMessage
END CATCH
bigint版本

----------------------------------------------
-- Try again with big ints
----------------------------------------------
SET NOCOUNT ON

CREATE TABLE 
    dbo.Tim_bigint
(
    tim_id bigint identity(9223372036854775806, 1) NOT NULL PRIMARY KEY
,   val int 
)

BEGIN TRY
    -- consumes the first value
    INSERT INTO
        dbo.Tim_bigint
    SELECT
        0 AS number

    SELECT SCOPE_IDENTITY() AS last_bigint_identity

    -- this insert brings us to the edge

    INSERT INTO
        dbo.Tim_bigint
    SELECT
        1 AS number

    SELECT SCOPE_IDENTITY() AS last_bigint_identity

    -- This one goes kaboom
    --Msg 8115, Level 16, State 1, Line 27
    --Arithmetic overflow error converting IDENTITY to data type bigint.
    INSERT INTO
        dbo.Tim_bigint
    SELECT
        -1 AS number
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
    ,   ERROR_SEVERITY() AS ErrorSeverity
    ,   ERROR_STATE() AS ErrorState
    ,   ERROR_PROCEDURE() AS ErrorProcedure
    ,   ERROR_LINE() AS ErrorLine
    ,   ERROR_MESSAGE() AS ErrorMessage
END CATCH
十进制版本

----------------------------------------------
-- Let's really max this out
----------------------------------------------
SET NOCOUNT ON

CREATE TABLE 
    dbo.Tim_decimal
(
    -- 10^38 -1
    -- 10^37 = 10000000000000000000000000000000000000
    -- 10^38 = 100000000000000000000000000000000000000
    tim_id decimal(38,0) identity(99999999999999999999999999999999999998, 1) NOT NULL PRIMARY KEY
,   val int 
)

BEGIN TRY
    -- consumes the first value
    INSERT INTO
        dbo.Tim_decimal
    SELECT
        0 AS number

    SELECT SCOPE_IDENTITY() AS last_decimal_identity


    -- this insert brings us to the edge

    INSERT INTO
        dbo.Tim_decimal
    SELECT
        1 AS number

    SELECT SCOPE_IDENTITY() AS last_decimal_identity

    -- This one goes kaboom
    --Msg 8115, Level 16, State 1, Line 27
    --Arithmetic overflow error converting IDENTITY to data type decimal.
    INSERT INTO
        dbo.Tim_decimal
    SELECT
        -1 AS number
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
    ,   ERROR_SEVERITY() AS ErrorSeverity
    ,   ERROR_STATE() AS ErrorState
    ,   ERROR_PROCEDURE() AS ErrorProcedure
    ,   ERROR_LINE() AS ErrorLine
    ,   ERROR_MESSAGE() AS ErrorMessage
END CATCH

如果在插入之前使用SET ARITHABORT OFF?:-)嗯。。。相同的。