像mysql一樣設定主鍵自增
這個問題說真的真的是給我卡住了,處于各種懵逼狀态!由于以前公司用的資料庫都是mysql以為直接Auto_Increment 就可以了~設定主鍵自增,結果可想而知!!! 真的是太慘了,耽誤了自己很長時間才把這個問題解決,而且,由于用的資料庫是Navcat Premium,這個工具也導緻踩了一個大坑!!!下面來記錄下這個問題
CREATE TABLE "HTD_BOSS"."Z_PULL_NEW_INTEGRAL" (
"id" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"orgid" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"memberno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"pullno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"pulltime" DATE NOT NULL ENABLE,
"pulltype" NUMBER NOT NULL ENABLE,
"integralnumber" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"integraltype" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"createtime" DATE NOT NULL ENABLE
)
-- 添加表注釋
COMMENT ON table Z_PULL_NEW_INTEGRAL IS '拉新積分詳情表';
-- 添加字段注釋
comment on column Z_PULL_NEW_INTEGRAL."id" is '唯一主鍵ID';
comment on column Z_PULL_NEW_INTEGRAL."orgid" is '門店ID';
comment on column Z_PULL_NEW_INTEGRAL."memberno" is '會員ID';
comment on column Z_PULL_NEW_INTEGRAL."pullno" is '被拉新人ID';
comment on column Z_PULL_NEW_INTEGRAL."pulltime" is '拉新時間';
comment on column Z_PULL_NEW_INTEGRAL."pulltype" is '拉新類型';
comment on column Z_PULL_NEW_INTEGRAL."integralnumber" is '本次拉新擷取積分數量';
comment on column Z_PULL_NEW_INTEGRAL."integraltype" is '積分擷取類型 1.簽到 2.拉新 3.普通購買商品 4.階梯團 5.定金團 6. 拼團';
comment on column Z_PULL_NEW_INTEGRAL."createtime" is '本條拉新記錄建立時間';
Oracle跟Mysql不一樣不能夠設定主鍵自增
oracle不能實作字段數值的自增長。可以通過序列和觸發器來實作一行資料在insert前實作某字段的自增。,是以試圖使用auto_increment的少年~跟我一樣,還是清醒下吧!!!
下面,我們通過序列和觸發器來實作這一個騷包操作!!!
- 1.建立一個序列
1)首先建立一個序列(就是每次查詢會自動增加值的絕不重複的對象,比如每次加1或每次加10)。文法:
CREATE SEQUENCE 序列名
[INCREMENT BY n] --每次加幾
[START WITH n] --序列從幾開始
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --最小值、最大值的限制
例如:create sequence Z_PULL_NEW_INTEGRAL_ID start with 1 increment by 1; 就是建立了額一個從1開始每次加1
的序列。通路序列時,用 序列名稱.nextval的文法。
查詢自己的出發去,記得用下面你的語句:select sequence_name from user_sequences
效果如圖所示:

- 2.建立觸發器
create or replace trigger Z_PULL_NEW_INTEGRAL_trigger
before insert on Z_PULL_NEW_INTEGRAL
for each row
when(new."id" is null)
begin
select Z_PULL_NEW_INTEGRAL_ID.nextval into:NEW."id" from dual;
end;
觸發器的意思是: 再插入Z_PULL_NEW_INTEGRAL表之前先去查詢一下目前表的下一個id是否為null如果為null的話,那麼就會将序列的下一個值插入到id字段中
下面我們來說一下用Navcat Premium的大坑!
由于一開始我使用的是可視化建表,而不是傳統的指令行建表,就導緻了我建立的表示這個樣子的:
CREATE TABLE "HTD_BOSS"."Z_PULL_NEW_INTEGRAL" (
"id" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"orgid" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"memberno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"pullno" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"pulltime" DATE NOT NULL ENABLE,
"pulltype" NUMBER NOT NULL ENABLE,
"integralnumber" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"integraltype" NUMBER ( 11, 0 ) NOT NULL ENABLE,
"createtime" DATE NOT NULL ENABLE
)
表名以及字段名都有雙引号-------> 雙引号的原因是Oracle資料庫區分大小寫,當你沒有用雙引号引起來的時候,他會預設轉換為大寫,當你用雙引号引用起來的時候就區分大小寫,是以我們在引用字段的時候需要加上雙引号,這個是一個大坑,大家需要謹記!!!
下面我們來展示效果
- 1.表結構
#建立Oracle資料庫表所遇到的問題 - 2.表裡面的資料
#建立Oracle資料庫表所遇到的問題 - 3.插入的資料
#建立Oracle資料庫表所遇到的問題
請注意我的SQL語句!說着說着坑就來了~“orgid” 是用雙引号引用起來的。。。,為什麼說,id是從5開始的? 因為,我以前插入過四條資料。。。哈哈哈,有問題[email protected]交流