1

当表中的一个字段被更新,而另一个字段依赖于该字段的数据时会发生什么?

我有名字,中间名,姓氏,全名字段。为“最后、第一、中间”数据插入一次 Full_name 列。

如果我删除中间名,如何更新 full_name 字段以从那里删除中间名?

谢谢。欢迎推荐书籍。

4

3 回答 3

3

表中的一列依赖于其他列中的数据,这违反了基本规范化。可以使用触发器来尝试保持数据同步,但这通常相当麻烦。你通常会得到更好的服务

  1. full_name从表中完全删除列。创建一个计算 的函数,full_name并在您想要生成全名时从应用程序调用该函数,或者将函数调用添加到应用程序用于查询数据的视图中。如果您需要按全名搜索,您可以在此函数的结果上创建基于函数的索引。
  2. 如果您使用的是 Oracle 11.1 或更高版本,您可以在表中定义一个虚拟列来计算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.
于 2012-08-23T16:42:41.903 回答
3

在 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;
于 2012-08-23T16:29:21.627 回答
0

您在这里要做的是创建一个触发器
触发器的工作方式是:

您的数据库会注意到某些事情发生了变化,并会在这种情况下执行您的要求。

于 2012-08-23T16:28:15.500 回答