首先,Oracle中沒(méi)有像MySQL那樣的id自增長(zhǎng)功能
創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)達(dá)茂旗,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
如果要用Oracle這么做的話首先要先建一個(gè)表,如:
CREATE
TABLE
test(
ID
Number(4)
NOT
NULL
PRIMARY
KEY,
NAME
VARCHAR(25),
PHONE
VARCHAR(10),
ADDRESS
VARCHAR(50));
然后,你需要一個(gè)自定義的sequence:
CREATE
SEQUENCE
emp_sequence
INCREMENT
BY
1
--
每次加幾個(gè)
START
WITH
1
--
從1開(kāi)始計(jì)數(shù)
NOMAXVALUE
--
不設(shè)置最大值
NOCYCLE
--
一直累加,不循環(huán)
NOCACHE
--
不建緩沖區(qū)
你只有了表和序列還不夠,還需要一個(gè)觸發(fā)器來(lái)執(zhí)行它:
CREATE
TRIGGER
"觸發(fā)器名稱"
BEFORE
INSERT
ON
example
FOR
EACH
ROW
WHEN
(new.id
is
null)
begin
select
emp_sequence.nextval
into:
new.id
from
dual;
end;
這時(shí)你再向test表中插數(shù)據(jù)就可以不用管id了
第一種,通過(guò)序列以及觸發(fā)器實(shí)現(xiàn)主鍵自增長(zhǎng)。
這種方式適用于直接使用JDBC連接數(shù)據(jù)庫(kù)。這種方式將主鍵自增長(zhǎng)的任務(wù)完全交給數(shù)據(jù)庫(kù),我們無(wú)需在代碼層面上進(jìn)行任何控制。
第二種,通過(guò)序列以及Hibernate配置實(shí)現(xiàn)自增長(zhǎng)。
這種方式適用于通過(guò)Hibernate連接數(shù)據(jù)庫(kù)的方式。這種方式在數(shù)據(jù)庫(kù)上創(chuàng)建序列,通過(guò)配置在POJO類上的注釋,讓Hibernate去調(diào)用數(shù)據(jù)庫(kù)的序列實(shí)現(xiàn)自增長(zhǎng)。
這兩種方式都是通過(guò)Oracle的序列實(shí)現(xiàn)自增長(zhǎng),但第一種通過(guò)數(shù)據(jù)庫(kù)的觸發(fā)器在插入的時(shí)候自動(dòng)插入主鍵。而后者則由Hibernate自動(dòng)完成獲取主鍵,插入主鍵這一操作。
這里Oracle數(shù)據(jù)庫(kù)使用命令行操作,注意Oracle不能直接設(shè)置自增字段,需要使用序列+觸發(fā)器來(lái)實(shí)現(xiàn)。
1.創(chuàng)建Book表
Create table Book(
Id NUMBER(6) constraint s_PK primary key,
Title nvarchar2(200) not null,
Author nvarchar2(200) not null,
Publisher nvarchar2(200) not null,
ISBN nvarchar2(50) not null,
Price NUMBER(6,2) not null,
CategoryName nvarchar2(50) not null,
Description nvarchar2(1000) not null,
ImageName varchar2(50)
);
2.創(chuàng)建自增序列
create sequence BOOK_seq (BOOK_seq為序列名,任意?。?/p>
increment by 1 (increment 表示字段逐條增加1)
start with 1 (設(shè)置自增序列的初始值為1)
nomaxvalue (不限制自增序列的最大值)
minvalue 1; (設(shè)置自增序列的最小值為1)
3.試用一下,向BOOK表中插入一條數(shù)據(jù),Id列就引用了自增序列。
insert into BOOK values(BOOK_seq.nextval,'a','a','a','a',32.1,'a',
'a','1.jpg');
注意:
操作之后記得輸入“commit;“保存操作。
Oracle數(shù)據(jù)庫(kù)的的命令行創(chuàng)建表,系統(tǒng)會(huì)自動(dòng)轉(zhuǎn)化為大寫(xiě)字母,假如使用數(shù)據(jù)庫(kù)操作客戶端,那么建表等操作時(shí)記得字段名大寫(xiě)。
關(guān)于主鍵:在建表時(shí)指定primary key字句即可:
create table test(
id ?number(6) primary key,
name varchar2(30)
);
如果是對(duì)于已經(jīng)建好的表,想增加主鍵約束,則類似語(yǔ)法:
alter table test add constraint pk_id primary key(id); ?
其中add constraint 和 primary key是關(guān)鍵字,pk_id是主鍵名稱,自定義的額,只要不重復(fù)即可。
也可以自動(dòng)一些,對(duì)表的插入操作,建立一個(gè)觸發(fā)器,每當(dāng)有數(shù)據(jù)插入時(shí),觸發(fā)器自動(dòng)修改id值為序列的新值,這樣就完全實(shí)現(xiàn)自增id功能了。不過(guò)其實(shí)也沒(méi)有這個(gè)必要。因?yàn)橛|發(fā)器如果建多了,有時(shí)會(huì)比較混亂,不易管理。
-----oracle 指定字段 自增 ,1.要先創(chuàng)建一個(gè)序列 2. 之后創(chuàng)建一個(gè)觸發(fā)器
--- 序列 (序列與觸發(fā)器實(shí)現(xiàn)t_sys_organize表中F_ID字段的自動(dòng)增長(zhǎng))
create sequence t_sys_organize_F_ID_SEQUENCE
minvalue 100000
maxvalue 99999999
start with 100000
increment by 1
nocache;
--觸發(fā)器 (序列與觸發(fā)器實(shí)現(xiàn)t_sys_organize表中F_ID字段的自動(dòng)增長(zhǎng))
CREATE OR REPLACE TRIGGER t_sys_organize_F_ID_TRIGGER BEFORE INSERT ON t_sys_organize FOR EACH ROW WHEN(NEW.F_ID IS NULL)
BEGIN
SELECT t_sys_organize_F_ID_SEQUENCE.NEXTVAL INTO:NEW.F_ID FROM dual;
END;
一、主鍵id自增
oracle 中不能設(shè)置自動(dòng)增加,這個(gè)和其他數(shù)據(jù)庫(kù)不一樣,但是有 序列,這個(gè)是Oracle自己特有的東西,
1、首先創(chuàng)建序列:create sequence seq;
語(yǔ)法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次加幾
[START WITH n] --序列從幾開(kāi)始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --小值、大值限制
比CREATE SEQUENCE seq start with 1 increment by 1; --建立了額從1開(kāi)始每次加1序列
訪問(wèn)序列時(shí)用 序列名稱.nextval語(yǔ)法
這就創(chuàng)建好了,然后 seq.nextval 就會(huì)返回一個(gè)值,不會(huì)重復(fù)的值,
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
insert into tablename values(seq.nextval,'test');
這樣前3個(gè)id 分別是 1,2,3
二、自動(dòng)生成UUID策略
import java.util.UUID;
Student s = new Student();
s.setId(UUID.randomUUID().toString());