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?:-)嗯。。。相同的。