oracle 在更新和插入时触发

oracle trigger on update and on insert

我在 MySQL 中定义了一个 table,如下所示。现在我想在 oracle 中创建这个 table。

但是如何将更新触发器转换为 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()
);

举个例子,所以:

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

从 Oracle 12c 开始,您可以避免在使用 IDENTITY 时使用 SEQUENCE,就像在标准 SQL.

中所做的那样

您的问题的解决方案如下

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;