【问题标题】:how to add a default value to the column in a Oracle database table using trigger?如何使用触发器向 Oracle 数据库表中的列添加默认值?
【发布时间】:2021-12-11 08:13:03
【问题描述】:

我有一个包含以下列的客户表:


CREATE TABLE customers
  (
    customer_id NUMBER 
                GENERATED BY DEFAULT AS IDENTITY START WITH 320 
                PRIMARY KEY,
    name         VARCHAR2( 255 ) NOT NULL,
    address      VARCHAR2( 255 )         ,
    website      VARCHAR2( 255 )         ,
    credit_limit NUMBER( 8, 2 )          ,
    isActive VARCHAR2(20) /*values are either TRUE or FALSE(default)*/
  );

这个表中已经有很多记录了,现在我想写一个触发器,所以当插入一个新的客户行时,isActive应该默认为FALSE

我做了这样的事情:

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS" BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
when (NEW.CUSTOMER_ID > 0)
BEGIN
UPDATE CUSTOMERS set NEW.ISACTIVE = 'FALSE';
dbms_output.put('updated flag: ' || new.ISACTIVE);
END;

但我收到以下错误:

Error: SQL statement ignored  
Error: ORA-00904: NEW.ISACTIVE invalid identifier  
Error: NEW.ISACTIVE must be declared  

我只是想在插入之前为isActive 列设置默认值,但无法成功。还想看看我是否需要添加任何其他验证。

感谢任何帮助。

【问题讨论】:

  • :新而不是新
  • 我已将所有新内容更新到 :New 并获得 invalid use of bind variable in trigger when clause
  • 为什么是触发器?你可以alter table customers modify inactive default on null 'FALSE'。尽管'TRUE''FALSE' 似乎是代表'Y''N' 的冗长方式。
  • 在我的回答中也指出了这一点。但是,尚不清楚@happytohelp 究竟试图实现什么。如果野外已经有一些插入“TRUE”的代码,并且他们需要覆盖它,那么默认值没有帮助

标签: sql oracle triggers


【解决方案1】:

编辑:此任务不需要触发器

ALTER TABLE CUSTOMER MODIFY isActive VARCHAR2(20) DEFAULT 'FALSE';

不要尝试更新触发器内的同一个表 - 你会得到一个“mutating table”错误。只需修改伪记录:NEW

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
BEGIN
    IF :NEW.CUSTOMER_ID > 0 THEN
        :NEW.ISACTIVE := 'FALSE';
    END IF;
    dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;

如果你想使用 WHEN 子句,请记住

在 WHEN 子句中指定的 NEW 和 OLD 关键字不被视为绑定变量,因此前面没有冒号 (:)。但是,在除 WHEN 子句之外的所有引用中,您必须在 NEW 和 OLD 之前使用冒号。所以

CREATE or REPLACE TRIGGER "UPDATE_ACTIVE_STATUS"
BEFORE INSERT ON CUSTOMERS
FOR EACH ROW
WHEN (NEW.CUSTOMER_ID > 0)
BEGIN
    :NEW.ISACTIVE := 'FALSE';
    dbms_output.put('updated flag: ' || :new.ISACTIVE);
END;

【讨论】:

  • 我认为 IF :NEW.CUSTOMER_ID > 0 而不是 IF :NEW.CUSTOMER_ID > O 对吧?
  • 好吧,当然 > 0。只是打错了
  • 顺便问一下,你真的需要那个条件:CUSTOMER_ID > 0?您要插入 CUSTOMER_ID 为零或负数的行吗?
  • 我们不会插入 0 或负的客户 ID
  • “我们不插入 0 或负的客户 ID” 那么在继续之前无需进行测试。另外,当唯一可能的值是“TRUE”(4 个字符)或“FALSE”(5 个字符)时,为什么 ISACTIVE 列是 varchar2(20)?为什么不只是 CHAR(1),其值为 'T' 或 'F'。并对其进行检查约束以防止无效值?
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多