当表中的一个字段更新,而另一个字段依赖于该字段的数据时会发生什么?
我有第一个,中间名,姓氏,full_name字段。 为“last,first,middle”数据插入一次Full_name列。
如果删除中间名, 如何更新full_name字段以从中删除中间名?
感谢。 欢迎预订。
答案 0 :(得分:3)
在版本11.1之前,Oracle不支持计算列,但您可以使用AFTER UPDATE TRIGGER
代替:
CREATE OR REPLACE TRIGGER PERSON_MIDDLE_NAME_COMPUTE
AFTER UPDATE ON PERSON
FOR EACH ROW
BEGIN
SELECT (:NEW.LAST || ',' || :NEW.FIRST || NVL2(:NEW.MIDDLE, ',' || :NEW.MIDDLE, ''))
INTO :NEW.FULL_NAME
FROM DUAL;
END;
答案 1 :(得分:3)
它违反了基本规范化,在表中有一列依赖于其他列中的数据。可以使用触发器来尝试保持数据同步,但这通常是相当麻烦的。
通常可以提供更好的服务full_name
列。创建一个计算full_name
的函数,并在要生成全名时从应用程序调用该函数,或者将函数调用添加到应用程序用于查询数据的视图中。如果需要按全名搜索,可以在此函数的结果上创建基于函数的索引。full_name
。虚拟列方法看起来像
SQL> ed
Wrote file afiedt.buf
1 create table foo (
2 first_name varchar2(100),
3 last_name varchar2(100),
4 middle_name varchar2(100),
5 full_name varchar2(304) generated always as (last_name || ', ' ||
6 first_name ||
7 (case when middle_name is not null
8 then ', ' || middle_name
9 else null
10* end)) virtual )
SQL> /
Table created.
SQL> insert into foo(first_name, last_name, middle_name)
2 values( 'Justin', 'Cave', 'O.J.' );
1 row created.
SQL> select full_name from foo;
FULL_NAME
--------------------------------------------------------------------------------
Cave, Justin, O.J.
答案 2 :(得分:0)
您要在此处创建a trigger 触发器的工作方式是:
您的数据库会发现某些内容已发生变化,并会在这种情况下执行您的要求。