2019年12月30日 星期一

Sybase自動遞增欄位設定與重設

Sybase ASE 15.7,如果要讓某個table的欄位設成類似MySQL的auto increment那樣自動遞增,也就是當新增資料進table時,它會將目前的最大值累加1?

[設定自動遞增欄位]

自動遞增欄位必須要是numeric型態,並且指定identity屬性,如此一來,它將在新增資料的時候,自動提增。

至於是不是每一次一定只可以遞增1呢?
不是,每一次遞增的幅度,可以在定義table的時候,以with identity_gap = 1語法來指定。
例如:
CREATE TABLE dbo.app_log
(
    sno NUMERIC(6,0) identity,
    log_message VARCHAR(1024) NULL,
    exp_message TEXT NULL,
    log_time DATETIME DEFAULT getdate(),
    PRIMARY KEY (sno)
)
with identity_gap = 1
把其中的identity_gap = 1改為identity_gap = 3,則每一次自動遞增的時候,是增加3。


[重設累加值]

設成identity的欄位我們會發現,其累加值並不會隨著資料的刪除,或是對table做TRUNCATE的動作,就重設。例如每次累加1,先在到了第15,我們把第15的資料項刪除,下一次新增資料進該表,它一樣會從16開始,不會又用回15,甚至是我們對table進行TRUNCATE,下一次新增時一樣從16開始。

那要怎麼樣才能重設該identity的值呢?
可以透過呼叫ASE內建的Stored Procedure(sp_chgattribute)來達成。

像是:
exec sp_chgattribute app_log, 'identity_burn_max', 0, '0'

上面sp_chgattribute是Stored Procedure名稱,app_log是我們table的名稱,最後一個參數'0',是是設定目前的identity累加值,也就是下一次新增時就會從這個值開始加上identity_gap。


以上面這個範例來說,每一次增加1,如果我們執行
exec sp_chgattribute app_log, 'identity_burn_max', 0, '3'
那下一次新增資料時,就是從4開始。

另外執行重設的時候也需注意:
傳入sp_chgattribute的參數,不能小於目前table中資料的最大值。
也就是說,如果上面的table目前有了12筆資料,identity_gap是1,所以它有1..2..3..到12的資料,那我們若是執行以下:
exec sp_chgattribute app_log, 'identity_burn_max', 0, '10'
資料庫會拋出錯誤:
Caused by: java.sql.SQLException: The value 10 for 'identity_burn_max' attribute must be greater than or equal to the current maximum identity value 12.

想也知道,如果目前有了到了12,我們設成從10開始,那下一次新增時,從第11開始,可是11已經存在了,這樣當然就會有問題了。

如果table中既有的資料都不要了,並且我們要它從第11開始,可以先下清空table的指令,再搭配sp_chgattribute,即可完成。

TRUNCATE TABLE xxxdb.dbo.app_log;
exec sp_chgattribute app_log, 'identity_burn_max', 0, '10'

沒有留言:

張貼留言