トリガーに頼る必要はありませんが、役立つ場合があります。構造を変更すると大いに役立ちますが、通常は CHECK 制約に依存します。MySQL では、CHECK 制約が必要な場合は、トリガーを作成するか、外部キー制約を使用する別のテーブルを追加する必要があります。
パートタイムの従業員が後でフルタイムになる可能性があるという点で、追加の負担があります。
ここでは、より標準的な SQL プラットフォーム用にどのように記述しますか。
create table emp (
emp_id integer primary key,
emp_type char(1) not null check (emp_type in ('f', 'p')), -- FK in your schema
emp_name varchar(50) not null,
start_date date not null default current_date,
unique (emp_id, emp_type)
);
create table full_time_emp (
emp_id integer primary key references emp (emp_id),
emp_type char(1) not null default 'f' check (emp_type = 'f'),
foreign key (emp_id, emp_type) references emp (emp_id, emp_type),
salary decimal(14,2) not null check (salary > 15000)
);
create table part_time_emp (
emp_id integer primary key references emp (emp_id),
emp_type char(1) not null default 'p' check (emp_type = 'p'),
foreign key (emp_id, emp_type) references emp (emp_id, emp_type),
rate decimal(14,2) not null check (rate > 0 and rate < 100)
);
テーブル full_time_emp では、これらの 2 つの制約
check (emp_type = 'f'),
foreign key (emp_id, emp_type) references emp (emp_id, emp_type),
一緒にすると、パートタイムの従業員がフルタイムのテーブルに表示されなくなります。「emp」の参照行に「p」が含まれている場合、外部キー参照は失敗します。「full_time_emp」に「p」を挿入しようとすると、チェック制約が失敗します。
この場合、チェック制約を 1 行テーブルと外部キー参照に置き換えることができます。テーブルには「f」のみを含める必要があります。(または、フルタイムの従業員を表すために使用する任意の ID 番号。) 「part_time_emp」についても同じことが機能します。したがって、CHECK 制約の代わりに、 full_time_emp に対してこれを行うことができます。
create table full_time_emp_check (
full_time_emp_type char(1) primary key
);
insert into full_time_emp_check values ('f');
alter table full_time_emp
add constraint full_time_emp_check
foreign key (emp_type) references full_time_emp_check (full_time_emp_type);
part_time_emp の変更も同様です。これらの両方のテーブルにトリガーを設定して、複数の行が含まれないようにすることができます。
追加のテーブルと外部キー参照を使用して、給与とレートのチェックを実装することもできます。ただし、死んだクジラをビーチに蹴り落とすようなものです。おそらく、MySQL のトリガーを使用して、そのような範囲制約を実装するでしょう。
IMHO、CHAR(1) コードは、従業員タイプの整数よりも優れています。人間が読めるコードには結合は必要ありません。