Oracle 创建表、定义序列以及创建触发器

Oracle 创建表、定义序列以及创建触发器

1. 定义序列

CREATE SEQUENCE <序列名>
	[MAXVALUE N|NOMAXVALUE]
	[MINVALUE N|NOMINVALUE]
[START WITH N] 
[INCREMENT BY N]
[CACHE N|NOCACHE]
[CYCLE|NOCYCLE];

参数说明:

  • INCREMENT BY:定义序列的步长,N如果为正值,表示序列是一个递增序列;N如果为负值,表示序列是一个递减序列;如果省略,则默认值为1。
  • START WITH:定义序列的起始值,如果省略,则默认值为1。
  • MAXVALUE:定义序列生成器能产生的最大值。选项 NOMAXVALUE 是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
  • MINVALUE:定义序列生成器能产生的最小值。选项 NOMAXVALUE 是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是-10的26次方;对于递增序列,最小值是1。
  • CYCLE | NOCYCLE:表示当序列生成器的值达到限制值后是否循环。CYCLE 代表循环,NOCYCLE 代表不循环。
  • CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE 表示不对序列进行内存缓冲。

2. 创建触发器

CREATE[OR REPLACE] TRIGGER <触发器名称>
	-- 触发条件:当向表 XXX 执行插入操作时触发此触发器
	BEFORE INSERT ON <表名> 
	-- 对每一行都检测是否触发
	FOR EACH ROW
-- 触发器开始
BEGIN
	-- 触发器主体内容,在此是取得 <序列名> 的下一个值插入到表 XXXXX 中的 <主键> 字段中
	SELECT <序列名>.NEXTVAL INTO :NEW.<主键> FROM DUAL;
END;

3. 创建表

CREATE TABLE "STUDENT"
(
    "S_ID"        NUMBER (20,0) NOT NULL ENABLE,
    "S_NO"        NUMBER (20,0) DEFAULT '',
    "S_NAME"      VARCHAR2 (255) DEFAULT '',
    "S_SEX"       CHAR(1) DEFAULT '0',
    "S_BIRTHDAY"  DATE,
    "S_CLASS"     NUMBER (20,0) DEFAULT '',
    "REMARK"      VARCHAR2(300) DEFAULT '',
    "DEL_FLAG"    CHAR(1) DEFAULT '0',
    "CREATE_BY"   VARCHAR2 (64) DEFAULT '',
    "CREATE_TIME" DATE,
    "UPDATE_BY"   VARCHAR2 (64) DEFAULT '',
    "UPDATE_TIME" DATE,
);

COMMENT ON TABLE STUDENT IS '学生表';

ALTER TABLE STUDENT
    ADD CONSTRAINT PK_S_NO PRIMARY KEY (S_NO);

COMMENT ON COLUMN STUDENT.S_ID IS 'ID';
COMMENT ON COLUMN STUDENT.S_NO IS '学号';
COMMENT ON COLUMN STUDENT.S_NAME IS '学生姓名';
COMMENT ON COLUMN STUDENT.S_SEX IS '学生性别';
COMMENT ON COLUMN STUDENT.S_BIRTHDAY IS '学生出生年月';
COMMENT ON COLUMN STUDENT.S_CLASS IS '学生所在班级';
COMMENT ON COLUMN STUDENT.REMARK IS '备注';
COMMENT ON COLUMN STUDENT.DEL_FLAG IS '删除标志(0代表存在 2代表删除)';
COMMENT ON COLUMN STUDENT.CREATE_BY IS '创建者';
COMMENT ON COLUMN STUDENT.CREATE_TIME IS '创建时间';
COMMENT ON COLUMN STUDENT.UPDATE_BY IS '更新者';
COMMENT ON COLUMN STUDENT.UPDATE_TIME IS '更新时间';

-- 创建序列
CREATE SEQUENCE SEQ_STUDENT_S_ID
    MINVALUE 1
    MAXVALUE 9999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;

-- 创建触发器
CREATE TRIGGER TRG_STUDENT_S_ID
    BEFORE INSERT ON STUDENT
    FOR EACH ROW
BEGIN
    SELECT SEQ_STUDENT_S_ID.NEXTVAL INTO :NEW.S_ID FROM DUAL;
END;

4. 获取上一个插入数据的id

DECLARE  newID NUMBER(20);
begin
insert into STUDENT ("S_NO", "S_NAME") values(001, "张XXX") RETURNING S_ID INTO newID;
COMMIT;
insert into SCORE("S_ID", "DEGREE") values(newID, 89);
end;

猜你喜欢

转载自blog.csdn.net/weixin_53313592/article/details/125854865
今日推荐