iT邦幫忙

0

MS SQL ,int型態最大數字 問題

sql
Luke 2018-10-25 09:35:1610046 瀏覽

請問在Create Table 時,使用了INT 當 主鍵(Primary Key)也會自動+1
INSERT 時,不用給DB 會自動給

那請問 ,int 範圍是-2147483648~2147483647
當超過2147483647 時,會怎樣? 無法INSERT還是?
若是這樣的狀況,該如何處理?

CREATE TABLE EMP_INFO (
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[EMP_ID] [char](12) NOT NULL
 CONSTRAINT [PK_SLITTING_HEADER_WM_RECORD] PRIMARY KEY CLUSTERED 
([ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
暐翰
iT邦大師 1 級 ‧ 2018-10-25 09:53:43
最佳解答

那請問 ,int 範圍是-2147483648~2147483647
當超過2147483647 時,會怎樣? 無法INSERT還是?

答:無法insert。會出現overflow error超出規定的最大值。
2018-10-25.09.50.44-image.png

若是這樣的狀況,該如何處理?

答:最簡單方式,改為 bigint Type。

ALTER TABLE 你的表格 ALTER COLUMN 你的表格PK欄位 bigint;

修改後就可以繼續新增資料,如圖片:
2018-10-25.09.53.14-image.png

測試Script:

--建立測試資料
CREATE TABLE [TestTable](
	[id] [int] IDENTITY(2147483649,1) NOT NULL,
	[value] [nchar](10) NULL,
 CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY];

insert into [TestTable] ([value]) values ('test'); --失敗因為超過int最大值,overflow error

--修改欄位類行為bigint
ALTER TABLE TestTable ALTER COLUMN id bigint;

--
insert into [TestTable] ([value]) values ('test'); --成功新增
看更多先前的回應...收起先前的回應...

大概又會問達到9223372036854775807該怎麼辦...XD

9223372036854775807 + 1
資料類型 bigint 時發生算術溢位錯誤。

暐翰 iT邦大師 1 級 ‧ 2018-10-25 10:14:04 檢舉

達到9223372036854775807該怎麼辦...XD

假如真的資料量大到bigint都不行 XD
麻煩把之前index某一個值之前資料搬到其他表格,使用DBCC CHECKIDENT ('[TestTable]', RESEED, 0);將自增值歸0。
2018-10-25.10.12.50-image.png

達到9223372036854775807該怎麼辦???

請先增加「至少」2305843 * 「至少」你每一列的資料量 顆 4TB的硬碟………

(我沒有認真的去想byte的問題,純粹是用帳面上的「正整數」來計算)

小魚 iT邦大師 1 級 ‧ 2018-10-25 12:00:05 檢舉

達到9223372036854775807該怎麼辦...XD

這種事讓你孫子的孫子來煩惱吧...

剛剛按了計算機..要1PB的硬碟~
才有辦法達到..9223372036854775807
哈...

1
黃彥儒
iT邦高手 1 級 ‧ 2018-10-25 09:50:50

你可以用BIGINT或是直接採UUID的方式作為主鍵
然後我講結論:會插入失敗
https://stackoverflow.com/questions/2295731/maximum-for-autoincremental-int-primary-key-in-sqlserver

我要發表回答

立即登入回答