表字段已更新

时间:2012-08-23 16:22:53

标签: sql oracle

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

我有第一个,中间名,姓氏,full_name字段。 为“last,first,middle”数据插入一次Full_name列。

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

感谢。 欢迎预订。

3 个答案:

答案 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)

它违反了基本规范化,在表中有一列依赖于其他列中的数据。可以使用触发器来尝试保持数据同步,但这通常是相当麻烦的。

通常可以提供更好的服务
  1. 完全从表格中删除full_name列。创建一个计算full_name的函数,并在要生成全名时从应用程序调用该函数,或者将函数调用添加到应用程序用于查询数据的视图中。如果需要按全名搜索,可以在此函数的结果上创建基于函数的索引。
  2. 如果您使用的是Oracle 11.1或更高版本,则可以在表中计算virtual column来计算full_name
  3. 虚拟列方法看起来像

    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 触发器的工作方式是:

您的数据库会发现某些内容已发生变化,并会在这种情况下执行您的要求。