更新和插入时的oracle触发器

时间:2015-04-21 05:58:00

标签: mysql sql oracle plsql

我在MySQL中定义了一个表如下。现在我想在oracle中创建这个表。

但是如何将更新触发器转换为oracle?

create table test(
    userid  INTEGER(10) NOT NULL AUTO_INCREMENT,
    CONSTRAINT PRIMARY KEY  (userid),
    fullname VARCHAR(200) NOT NULL,
    email VARCHAR(50) NOT NULL,
    createdat DATETIME NOT NULL DEFAULT NOW(),
    updatedat DATETIME ON UPDATE NOW()
);

2 个答案:

答案 0 :(得分:3)

举个例子,所以:

CREATE TABLE test
(
      userid    INTEGER PRIMARY KEY
    , fullname  VARCHAR2(200) NOT NULL
    , email     VARCHAR2(50) NOT NULL
    , createdat DATE DEFAULT CURRENT_DATE NOT NULL
    , updatedat DATE
);

CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER test_insert
  BEFORE INSERT
  ON test
  FOR EACH ROW
BEGIN
  SELECT test_seq.NEXTVAL
   INTO :new.userid
    FROM DUAL;
END;

CREATE OR REPLACE TRIGGER test_update
  BEFORE UPDATE
  ON test
  FOR EACH ROW
BEGIN
  SELECT CURRENT_DATE
    INTO :new.updatedat
    FROM DUAL;
END;

触发器可以是BEFORE UPDATEAFTER UPDATEINSTEAD。选择你想要的。有关更多信息,请阅读文档http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7004.htm

答案 1 :(得分:0)

从Oracle 12c开始,您可以避免像在标准SQL中那样使用SEQUENCE来使用IDENTITY

正在解决您的问题

CREATE TABLE test
    ( userid    INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    , fullname  VARCHAR2(200) NOT NULL
    , email     VARCHAR2(50) NOT NULL
    , createdat DATE DEFAULT CURRENT_DATE NOT NULL
    , updatedat DATE
    );

CREATE OR REPLACE TRIGGER test_update
  BEFORE UPDATE
  ON test
  FOR EACH ROW
BEGIN
  SELECT CURRENT_DATE
    INTO :new.updatedat
    FROM DUAL;
END;