螺灣小成 oracle實現自增長列
序列(Sequence)是一種可以被多個使用者使用的用於產生一系列唯一數位資料庫物件。序列定義儲存在資料字典中,通過提供唯一數值的順序表來簡化程式設計工作,可以使用序列自動產生主鍵的索引值。當一個序列第一次被查詢調用時,它將返回一個預定值。在隨後的每次查詢中,序列將產生一個按指定的增量增長的值。序列可以迴圈,或者是連續增加的,直到指定的最大值為止。建立序列文法如下:create sequence [模式]序列名稱[start with 起始數字] [increment by 增量][maxvalue 最大值|nomaxvalue][minvalue 最小值|nominva lue][cycle|nocuyle][cache 數目|nocache][order|noorder]。
通過序列起始數字、最大值、最小值和增量值可以確定序列是增序還是減序,每次增或減的多少。Nocyle選項用於確定在序列達到最大值(增序列)或最小值(減序列)之後不能再產生更多的值,用以防止序列迴轉。
在Oracle資料庫中建立序列,在使用sql語句向資料庫中寫入資料的時候,利用序列產生的唯一值,實現表中主索引值自增。例如:
SQL>create table tablename (id number notnull,…); SQL >create sequence autoID increment by 1 start with 1 maxvalue 999999 cycle; SQL >insert into tablename values(autoID.nextval,...);
多個使用者可以共用一個序列,但它是針對所有的表,因此產生的序號對一個表而言產生的主索引值唯一但是不連續。
使用觸發器產生主索引值。
在資料表中,有時候需要主索引值自動增加,但在Oracle資料庫中,沒有象Mysql的Autoincrement一樣自動成長的資料類型。在實現Oracle資料庫欄位自增功能時,利用DML觸發器來完成。
觸發器(trigger)是一些過程,當發生一個特定的資料庫事件時就執行這些過程,可以使用觸發器擴充引用的完整性。DML即資料操縱語言,用於讓使用者或程式員使用,實現對資料庫中資料的操作。基本的資料操作分成兩類四種:檢索(查詢)和更新(插入、刪除、修改)。觸發器類似於函數和過程,其在資料庫中以獨立身分存在。觸發事件可以是對資料庫表的DML(insert、update或delete)操作等。DML觸發器是目前最廣泛使用的一種觸發器,即由DML語句激發的觸發器,並有該語句決定DML觸發器的類型。其觸發事件包括insert(插入)、update(更新)和delete(刪除)。無論哪種觸發事件,都能為每種觸發事件建立before觸發器和after觸發器。如可以在表上建立一個before insert 語句,表示在insert事件發生之前採取行動。
建立觸發器的文法如下:
create [or replace] trigger 觸發器名稱 {before|after|insteadof} 激發觸發事件 referencing_clause [WHEN trigger_condition] [FOR EACH ROW]
referencing_clause用來引用正在處於修改狀態下的行中的資料,如果在WHEN子句中指定trigger_condition的話,則首先對該條件求值。觸發器主體只有在該條件為真值時才運行。利用觸發器與序列相結合,可以實現在進行DML操作的時候,使表中主索引值自動增加。其實現步驟可參照如下例子。
drop table book; --建立表 create table book( bookId varchar2(4) primary key, name varchar2(20) ); --建立序列 create sequence book_seq start with 1 increment by 1; --建立觸發器 create or replace trigger book_trigger before inserton book for each row begin select book_seq.nextval into :new.bookId from dual; end ; --添加資料 insert into book(name) values ('cc'); insert into book(name) values ('dd'); commit;
查詢資料:select *from book;
當需要對book資料庫表中的主索引值進行寫值時,便可以使用sql語句利用序列+觸發器實現主索引值自動增加.
這裡所說的自動成長列,主要是指一個表中主鍵id的自動成長。
Oracle與Mysql不同,不能在CREATE建立表時設定自動成長列功能。Oracle必須通過建立sequence序列來實現自動增加列的功能。
首先要建立序列(當然必須要先建好表,添加好主鍵約束,這列假設約束名為test_sequence)
create sequence test_sequence
[increment by 1]--增長的步長
[start with 1]--從幾開始增長
[maxvalue 100]--增長的最大值
[nomaxvalue]--不設最大值
[cycle|nocycle];--迴圈增長/不迴圈增長
定義了sequence以後就可以在insert語句中使用test_sequence.nextval和test_sequence.currval。
test_sequence.currval返回當前sequence的值,但必須在第一次初始化test_sequence.nextval後才能使用
test_sequence.currval。
test_sequence.nextval會增加sequence的值,並返回增加後的sequence的值。
然後可以alter修改sequence序列,來改變自動增加的方式。
alter sequence test_sequence increment by 1 ...;後面的選項跟建表時一樣。
還可以用drop刪除sequence序列。
drop sequence test_sequence;
Mysql先對Oracle來說就簡單多了,可以在建表時進行設定。
create table(
id int(10) auto_incrementprimary key
)auto_increment=1;
auto_increment=1設定自動成長列從1開始
曾經給某個Mysql表格添加主鍵時,用了以下SQL語句 alter table `表格名` add column `列名` int not null auto_increment comment '主鍵' before `某一列名`;
結果遇到如下兩個錯誤 : Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'before 列名' at line 1 (0 ms taken)
這個錯誤是說before附近有語法錯誤 Error Code : 1075 Incorrect table definition; there can be only one auto column and it must be defined as a key (0 ms taken)
這個錯誤是說只有主鍵才能指定自動成長列
網上找了下原因,說是要先添加列,再修改列。我覺得這樣挺麻煩的。自己實驗了一下,一句話也能搞定: alter table `表格名` add column `列名` int not null auto_increment primary key comment '主鍵' first;
上面語句表示給某個表格添加一個自動成長的主鍵欄位,並且將該欄位放在第一列。
如果你想放到其他列後面,可以將上面sql語句中的 first 換成 after `已經有的列名`
MYSQL自動成長列的問題,
表是這樣的:
create table tips
(
id int auto_increment not null,
date varchar(10) null,
content varchar(300) null.
primary key(id)
)
我插入一條資料
insert into tips values("2009/09/20","小TIPS");
結果報錯了,
其實應該這樣寫:
insert into tips(date,content) values("2009/09/20","小TIPS") ;
或者
insert into tips values(null,"2009/09/20","小TIPS") ;