1

テーブル内の 1 つのフィールドが更新され、別のフィールドのデータがそのフィールドに依存している場合はどうなりますか?

名、ミドルネーム、姓、フルネームのフィールドがあります。Full_name 列は、「最後、最初、中間」のデータに対して 1 回挿入されます。

ミドル ネームを削除した場合、full_name フィールドを更新してそこからもミドル ネームを削除するにはどうすればよいですか?

ありがとう。本の推薦を歓迎します。

4

3 に答える 3

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;
于 2012-08-23T16:29:21.627 に答える
3

テーブルの 1 つの列が他の列のデータに依存することは、基本的な正規化に違反します。トリガーを使用してデータの同期を維持することは可能ですが、一般的にはかなり面倒です。あなたは一般的にはるかに優れています

  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 に答える
0

ここで実行したいのは、トリガーを作成することです。
トリガーが機能する方法は次のとおりです。

データベースは何かが変更されたことに気づき、その状況であなたが要求したことを実行します。

于 2012-08-23T16:28:15.500 に答える