天天看點

#建立Oracle資料庫表所遇到的問題

像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
           

效果如圖所示:

#建立Oracle資料庫表所遇到的問題
  • 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]交流