达梦数据库修改字段长度_DM7 达梦数据库 序列 和 自增列 说明
在DM 數據庫中,自增有兩種方法實現,一種是自增列,另一種通過序列實現。
1 自增列
1.1 創建自增列
在創建表時可以制定列是否自增。 一個表只能有一個自增列。
語法格式https://www.cndba.cn/cndba/dave/article/3590
IDENTITY [ (種子, 增量) ]
https://www.cndba.cn/cndba/dave/article/3590
參數
1.種子:裝載到表中的第一個行所使用的值;
2.增量:增量值,該值被添加到前一個已裝載的行的標識值上。增量值可以為正數或負數,但不能為 0。
1.IDENTITY 適用于 int(-2147483648~+2147483647)、bigint(-2^63~+2^63-2)類型的列;每個表只能創建一個自增列;
2.不能對自增列使用 DEFAULT 約束;
3.必須同時指定種子和增量值,或者二者都不指定。如果二者都未指定,則取默認值(1,1);若種子或增量為小數類型,報錯;
4.最大值和最小值為該列的數據類型的邊界;
5.建表種子和增量大于最大值或者種子和增量小于最小值時報錯;
6.自增列一旦生成,無法更新,不允許用 Update 語句進行修改;https://www.cndba.cn/cndba/dave/article/3590
臨時表、列存儲表、水平分區表、垂直分區表不支持使用自增列。
SQL> create table HuaiNing(id int identity,name varchar(20));
executed successfully
used time: 6.902(ms). Execute id is 551.
SQL>
SQL> desc huaining
LINEID NAME TYPE$ NULLABLE
---------- ---- ----------- --------
1 ID INTEGER N
2 NAME VARCHAR(20) Y
used time: 12.016(ms). Execute id is 552.
SQL>
1.2 自增列查詢函數
1)IDENT_SEED (‘tablename’) : 返回種子值,該值是在帶有自增列的表中創建自增列時指定的。
SQL> select ident_seed('CNDBA.HUAINING');
LINEID IDENT_SEED('CNDBA.HUAINING')
---------- ----------------------------
1 1
used time: 2.280(ms). Execute id is 553.
SQL>
2)IDENT_INCR (‘tablename’):返回增量值,該值是在帶有自增列的表中創建自增列時指定的。
SQL> select ident_incr('CNDBA.HUAINING');
LINEID IDENT_INCR('CNDBA.HUAINING')
---------- ----------------------------
1 1
used time: 2.114(ms). Execute id is 555.
SQL>
3)SET IDENTITY_INSERT 屬性: 設置是否允許將顯式值插入表的自增列中。
語法格式:
SET IDENTITY_INSERT [.] ON | OFF;
使用說明
1.IDENTITY_INSERT 屬性的默認值為 OFF。SET IDENTITY_INSERT 的設置是在執行或運行時進行的。當一個連接結束,IDENTITY_INSERT 屬性將被自動還原為 OFF;
2.DM 要求一個會話連接中只有一個表的 IDENTITY_INSERT 屬性可以設置為 ON,當設置一個新的表 IDENTITY_INSERT 屬性設置為 ON 時,之前已經設置為 ON 的表會自動還原為 OFF。當一個表的 IDENTITY_INSERT 屬性被設置為 ON 時,該表中的自動增量列的值由用戶指定。如果插入值大于表的當前標識值(自增列當前值),則 DM 自動將新插入值作為當前標識值使用,即改變該表的自增列當前值;否則,將不影響該自增列當前值;
3.當設置一個表的 IDENTITY_INSERT 屬性為 OFF 時,新插入行中自增列的當前值由系統自動生成,用戶將無法指定;
4.自增列一經插入,無法修改;
5.手動插入自增列,除了將 IDENTITY_INSERT 設置為 ON,還要求在插入列表中明確指定待插入的自增列列名。插入方式與非 IDENTITY 表是完全一樣的。如果插入時,既不指定自增列名也不給自增列賦值,則新插入行中自增列的當前值由系統自動生成。
#插入時沒有制定id的值:
SQL> insert into huaining values('dave');
affect rows 1
used time: 2.114(ms). Execute id is 557.
SQL> insert into huaining values('cndba');
affect rows 1
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- -----
1 1 dave
2 2 cndba
used time: 1.177(ms). Execute id is 562.
SQL>
#將 IDENTITY_INSERT 設置為 ON,然后顯示的指定id的值:
SQL> set identity_insert cndba.huaining on;
executed successfully
used time: 1.226(ms). Execute id is 568.
#注意這里,簡寫不行:
SQL> insert into huaining values(4,'hefei');
insert into huaining values(4,'hefei');
[-2723]:Error in line: 1
Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value.
used time: 0.862(ms). Execute id is 0.
SQL> insert into huaining(id,name) values(4,'hefei');
affect rows 1
used time: 1.846(ms). Execute id is 569.
SQL> commit;
executed successfully
used time: 10.203(ms). Execute id is 570.
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- -----
1 1 dave
2 2 cndba
3 4 hefei
used time: 0.643(ms). Execute id is 571.
SQL>
SQL> update huaining set id=3 where name='hefei';
update huaining set id=3 where name='hefei';
[-2664]:Error in line: 1
Try to alter identity column [ID].
used time: 1.558(ms). Execute id is 0.
SQL>
5) 還原 IDENTITY_INSERT 屬性。
SQL> set identity_insert cndba.huaining off;
executed successfully
used time: 1.489(ms). Execute id is 572.
6) 插入后再次查詢。
SQL> insert into huaining values('anqing');
affect rows 1
used time: 2.026(ms). Execute id is 573.
SQL> commit;
executed successfully
used time: 10.943(ms). Execute id is 574.
#注意這里的id值是從5開始的:
SQL> select * from huaining;
LINEID ID NAME
---------- ----------- ------
1 1 dave
2 2 cndba
3 4 hefei
4 5 anqing
used time: 1.757(ms). Execute id is 575.
SQL>
2 序列
序列是一個數據庫實體,通過它多個用戶可以產生唯一整數值,可以用序列來自動地生成主關鍵字值。
2.1 創建序列
語法格式:
CREATE SEQUENCE [ .] [ ];
::= {}
::=
INCREMENT BY |
START WITH |
MAXVALUE |
NOMAXVALUE|
MINVALUE |
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE |
NOCACHE|
ORDER |
NOORDER |
GLOBAL |
LOCAL
參數
指明被創建的序列屬于哪個模式,缺省為當前模式;
指明被創建的序列的名稱,序列名稱最大長度128字節;
指定序列數之間的間隔,這個值可以是[-1000000, 1000000]之間任意的DM正整數或負整數,但不能為0。如果此值為負,序列是下降的,如果此值為正,序列是上升的。如果忽略INCREMENT BY子句,則間隔缺省為1。增量值的絕對值必須小于( - );
指定被生成的第一個序列數,可以用這個選項來從比最小值大的一個值開始升序序列或比最大值小的一個值開始降序序列。對于升序序列,缺省值為序列的最小值,對于降序序列,缺省值為序列的最大值;
指定序列能生成的最大值,如果忽略MAXVALUE子句,則降序序列的最大值缺省為 -1 ,升序序列的最大值 缺 省 為9223372036854775807(0x7FFFFFFFFFFFFFFF),若指定的最大值超出缺省最大值,則DM自動將最大值置為缺省最大值。非循環序列在到達最大值之后,將不能繼續生成序列數;
指定序列能生成的最小值,如果忽略MINVALUE子句,則升序序列的最小值缺省為 1 ,降序序列的最小值 缺 省 為 -9223372036854775808(0x8000000000000000),若指定的最小值超出缺省最小值,則DM自動將最小值置為缺省最小值。循環序列在到達最小值之后,將不能繼續生成序列數。最小值必須小于最大值;
CYCLE 該關鍵字指定序列為循環序列:當序列的值達到最大值/最小值時,序列將從最小值/最大值計數;
NOCYCLE 該關鍵字指定序列為非循環序列:當序列的值達到最大值/最小值時,序列將不再產生新值;
CACHE 該關鍵字表示序列的值是預先分配,并保持在內存中,以便更快地訪問;指定預先分配的值的個數,最小值為2;最大值為50000;且緩存值不能大于( - )/;
NOCACHE 該關鍵字表示序列的值是不預先分配;
ORDER 該關鍵字表示以保證請求順序生成序列號;
NOORDER 該關鍵字表示不保證請求順序生成序列號;
GLOBAL 該關鍵字表示MPP環境下序列為全局序列,缺省為GLOBAL;
LOCAL 改關鍵字表示MPP環境下序列為本地序列。
SQL> create table anqing(id int);
executed successfully
used time: 5.814(ms). Execute id is 576.
SQL> create sequence seq_id increment by 10;
executed successfully
used time: 4.758(ms). Execute id is 577.
SQL>
#插入序列值:
SQL> create sequence seq_id increment by 10;
executed successfully
used time: 4.758(ms). Execute id is 577.
SQL> insert into anqing(seq_id.nextval);
insert into anqing(seq_id.nextval);
insert into anqing(seq_id.nextval);
*
line 1, column 34, nearby [;] has error[-2007]:
Syntax error.
used time: 1.101(ms). Execute id is 0.
SQL>
SQL> insert into anqing(id) values(seq_id.nextval);
affect rows 1
used time: 2.996(ms). Execute id is 578.
SQL> select * from anqing;
LINEID ID
---------- -----------
1 1
used time: 2.227(ms). Execute id is 579.
SQL>
2.2 序列修改語句
DM 系統提供序列修改語句,包括修改序列步長值、設置序列最大值和最小值、改變序列的緩存值、循環屬性、ORDER 屬性。
語法格式
ALTER SEQUENCE [ .] [ ];
::= {}
::=
INCREMENT BY |
MAXVALUE |
NOMAXVALUE|
MINVALUE |
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE |
NOCACHE|
ORDER|
NOORDERhttps://www.cndba.cn/cndba/dave/article/3590
#創建完序列后直接修改序列的步長。
SQL> CREATE SEQUENCE SEQ1 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE CACHE 10;
executed successfully
used time: 7.370(ms). Execute id is 580.
SQL> ALTER SEQUENCE SEQ1 INCREMENT BY 1 ;
executed successfully
used time: 13.188(ms). Execute id is 581.
SQL> SELECT SEQ1.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 -994
used time: 1.474(ms). Execute id is 582.
SQL>
#創建序列后使用NEXTVAL訪問了序列,然后修改步長。
SQL> CREATE SEQUENCE SEQ2 INCREMENT BY 1000 START WITH 5 NOMAXVALUE NOMINVALUE NOCACHE ;
executed successfully
used time: 10.377(ms). Execute id is 583.
SQL> SELECT SEQ2.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 5
used time: 1.350(ms). Execute id is 584.
SQL> ALTER SEQUENCE SEQ2 INCREMENT BY 1 ;
executed successfully
used time: 5.307(ms). Execute id is 585.
SQL> SELECT SEQ2.NEXTVAL FROM DUAL;
LINEID NEXTVAL
---------- --------------------
1 6
used time: 2.130(ms). Execute id is 586.
SQL>
#例3 修改序列的最小值。
SQL> CREATE SEQUENCE SEQ3 INCREMENT BY 1 START WITH 100 MINVALUE 3 ;
executed successfully
used time: 4.964(ms). Execute id is 587.
SQL> ALTER SEQUENCE SEQ3 MINVALUE 2;
executed successfully
used time: 5.278(ms). Execute id is 588.
SQL>
2.3 序列刪除語句
DM 系統允許用戶在建立序列后還可隨時刪除序列。
語法格式:
DROP SEQUENCE [ .];https://www.cndba.cn/cndba/dave/article/3590https://www.cndba.cn/cndba/dave/article/3590
SQL> drop sequence seq3;
executed successfully
used time: 14.809(ms). Execute id is 589.
SQL>
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
總結
以上是生活随笔為你收集整理的达梦数据库修改字段长度_DM7 达梦数据库 序列 和 自增列 说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ap的ht模式_AP6256 STA模式
- 下一篇: java当前月份减一个月_在java编程