可能重复:
What happens to the primary key Id? when it goes over the limit?如果达到标识列的最大值,会附加什么?
,如果有一个SQL Server表与标识列究竟会追加(说一个int)到达INT的最大容量是多少?
回到开头?
假设线增长100 100。每次我插入100条新线,我删除100分旧的。
谢谢您的回答 问候
可能重复:
What happens to the primary key Id? when it goes over the limit?如果达到标识列的最大值,会附加什么?
,如果有一个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')
它不会让你插入更多行。
的东西我不知道的是身份的功能(@@identity,SCOPE_IDENTITY和IDENT_CURRENT)返回一个十进制(38,0)值,无论什么你的本地身份字段定义如。
正如其他人所指出的,该错误信息是一样的性质 Arithmetic overflow error converting IDENTITY to data type 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
如果你在INSERT之前使用SET ARITHABORT OFF? :-)嗯......一样。 – xanatos