嗨,开发人员要求在表格上添加一个列,其默认值为' N'但是如果该条目的id = 3,则此列的默认值应为&# 39; Y',无论如何我能在oracle中实现这个目标吗?
答案 0 :(得分:0)
11g方法
从Oracle 11g
开始,您可以使用VIRTUAL columns
一步完成此操作。
测试用例
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>
因此,DECODE
列声明中的VIRTUAL
函数可以处理您的需求。
10g方法
您可以使用 -
来满足要求DEFAULT
值AFTER INSERT TRIGGER
醇>
创建表格,使DEFAULT
值为“N”。只有在插入一个值为id
column = 3的新行时才触发触发器,以便触发器将值更新为“Y”。否则对于所有其他情况,默认值为“N”。
答案 1 :(得分:0)
将新列添加到表后,您可以使用以下查询在列中插入值:
update table_name set column_name = ( case when id = 3 then 'Y' else 'N' end );
在插入新记录时,您可以使用以下方法:
1)在创建插入查询时确定列,您可以在创建查询时为其添加逻辑
2)在数据库中创建一个触发器,它应该在向表中插入任何新行后更新列值。
答案 2 :(得分:0)
这是一个非常糟糕的数据库设计。它不尊重关系数据库的正常形式。 我建议保持该表不变,并在表格上创建一个新视图,其中包含一个额外的列,该列使用DECODE或CASE WHEN ...
答案 3 :(得分:0)
我同意那些提到这不是一个好的数据库设计的评论者。也就是说,在现实生活中,与数据库设计妥协并不罕见。
我不确定虚拟列是否是想要的。 OP要求采用默认方式;虚拟列的工作方式与默认约束不同(例如,使用默认约束,我们可以将默认值以外的值插入列中。最佳路径可能是使用触发器设置“默认”值:
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(两者都标记了),触发器也会起作用。
希望这有帮助。
答案 4 :(得分:0)
使用附加值列创建一个新表:
create table table1 as
select u.*,
case when id=3 then 'Y' ELSE 'N'
END value
from table2 u