DB2 自增長列測試
1當想將表中一列修改為自動成長時,可用下面命令:
Alter table <table name> alter column <column name> set not null
Alter table <table name> alter column <column name> set generated always as identity (start with 1,increment by 1)
上面命令是在改一表中列的屬性時,在網上找到的很有用。
2當修改表中一列自動成長的開始值時,可用下面的命令:
ALTER TABLE <talbe_name> ALTER COLUMN <column name> RESTART WITH 18;
測試:
CREATE TABLE customer_orders_t (
order_id INT NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
NO CACHE
ORDER),
order_date DATE NOT NULL,
cust_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
status CHAR(9) NOT NULL,
PRIMARY KEY (order_date, order_id))
註:該列中的以及它本身的 IDENTITY 屬性並沒有保證所產生的序列值是唯一的。
但是, PRIMARY KEY 約束保證了表中行的唯一性。
為了確保只將自動產生的值插入識別欄位,他們指定了 GENERATED ALWAYS 子句。
使用最後一個產生的 order_id 來確定多少資料
選項 NO CACHE 和 ORDER 確保了在系統故障的情況下,不廢棄未使用的標識值。
測試1
插入資料
insert into customer_orders_t values (default,current date,12,12,12,10.2,'2')
--成功
insert into customer_orders_t values (1,current date,12,12,12,10.2,'2')
-- 報錯 因為:IDENTITY欄位不允許指定值
--解決方案
ALTER TABLE customer_orders_t
ALTER COLUMN order_id
SET GENERATED BY DEFAULT
--建立orders_seq對象
CREATE SEQUENCE orders_seq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
NO MAXVALUE
NO CYCLE
NO CACHE
ORDER
--插入資料
INSERT INTO customer_orders_t VALUES (NEXT VALUE FOR orders_seq, CURRENT DATE,12,12,12,10.2,'2')
1、命令列取sequence soc.nico_qian的下一個值:
db2 "values next value for soc.nico_qian"
2、命令列重設sequence soc.nico_qian:
db2 "alter sequence soc.nico_qian restart",重設後的值預設為建立SEQUENCE時的MINVALUE
3、命令列以指定值22重設sequence soc.nico_qian:
db2 "alter sequence soc.nico_qian restart with 22"
4、命令列重設表KS.CHECK_CONDITION的IDENTITY欄位初始值為20:
db2 "ALTER TABLE KS.CHECK_CONDITION ALTER COLUMN identity_column_name RESTART WITH 20"
5、如果sequence被以命令列的方式重設,那麼用到這個sequence的嵌入式C程式碼的綁定包
的VALID欄位會被修改為N,那麼在下一次這個代碼被調用的時候,DB2會自動重新綁定
此代碼的綁定包,這個動作會給應用程式帶來不可預知的後果,比如:如果這段代碼是在很
頻繁的被用到的時間段內被重新綁定,那麼極易造成死結。
同樣的問題會出現在IDENTITY欄位上。