当表中的一个字段被更新,而另一个字段依赖于该字段的数据时会发生什么?
我有名字,中间名,姓氏,全名字段。为“最后、第一、中间”数据插入一次 Full_name 列。
如果我删除中间名,如何更新 full_name 字段以从那里删除中间名?
谢谢。欢迎推荐书籍。
表中的一列依赖于其他列中的数据,这违反了基本规范化。可以使用触发器来尝试保持数据同步,但这通常相当麻烦。你通常会得到更好的服务
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.
在 11.1 版本之前,Oracle 不支持计算列,但您可以使用 anAFTER 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;
您在这里要做的是创建一个触发器。
触发器的工作方式是:
您的数据库会注意到某些事情发生了变化,并会在这种情况下执行您的要求。