开发人员要求在一个表格中添加一列,默认值为'N',但是如果条目的id = 3,则此列的默认值应为'Y',有没有办法在Oracle中实现这一点?
CREATE OR REPLACE TRIGGER mytrigger
BEFORE INSERT ON mytable FOR EACH ROW
WHEN (new.mycolumn IS NULL)
BEGIN
SELECT DECODE(id, 3, 'Y', 'N') INTO :new.mycolumn FROM dual;
END;
/
无论您使用Oracle 10g还是11g(您已经标记了这两个版本),触发器都可以正常工作。
希望这可以帮助您。
:new.mycolumn := CASE :new.id WHEN 3 THEN 'Y' ELSE 'N' END;
而不是 SELECT
,您可以节省 PL/SQL 引擎跳转到 SQL 引擎并返回以执行 IF 测试的成本。此外,我认为在没有 :new.
的情况下,您对 id
的引用将不在范围内。我也欢迎您对在此处使用 :old
而不是 :new
进行评论。 - UnoembreCASE
之外,我们还可以使用DECODE(:new.id, 3, 'Y', 'N')
。 - David FaberDECODE
仅在 SQL 中有效,而不在 PL/SQL 中有效。CASE
在两者中都有效。 - Unoembre11g方法
从Oracle 11g
及以上版本开始,您可以使用VIRTUAL列
一步完成此操作。
测试案例
SQL> CREATE TABLE tab_default (
2 ID NUMBER,
3 flag varchar2(1) GENERATED ALWAYS AS (decode(id, 3, 'Y', 'N')) VIRTUAL
4 );
Table created.
SQL>
SQL> INSERT INTO tab_default (ID) VALUES (1);
1 row created.
SQL> INSERT INTO tab_default (ID) VALUES (3);
1 row created.
SQL> INSERT INTO tab_default (ID) VALUES (10);
1 row created.
SQL> SELECT * FROM tab_default;
ID F
---------- -
1 N
3 Y
10 N
SQL>
所以,在VIRTUAL
列声明中使用DECODE
函数可以为您处理要求。
10g方法
您可以使用以下方法来满足要求:
DEFAULT
值AFTER INSERT TRIGGER
创建表时将DEFAULT
值设置为'N'。仅在插入新行且id
列的值为3时触发触发器,使触发器将该值更新为'Y'。否则,对于所有其他情况,缺省值将为'N'。
在向您的表中添加新列后,您可以使用以下查询向该列插入值:
update table_name set column_name = ( case when id = 3 then 'Y' else 'N' end );
这是一个非常糟糕的数据库设计。它不符合关系型数据库的规范。 我建议保留该表并在该表上创建一个新视图,其中包含一个额外的列,可以使用DECODE或CASE WHEN进行计算。
create table table1 as
select u.*,
case when id=3 then 'Y' ELSE 'N'
END value
from table2 u
column = 'N'; if(id == 3) then column = 'Y'; -----store row in DB------
。如果数据库中存在行,则只需使用case when
语句更新现有行的列。 - Deep