9

このサンプル データベースを見てみましょう。 サンプルデータベース

ご覧のとおり、person は都市に依存します (person.city_id は外部キーです)。行は削除せず、非アクティブ (アクティブ = 0) に設定するだけです。都市を非アクティブに設定した後、この都市に依存しているすべての人を自動的に非アクティブにするにはどうすればよいですか? トリガーを書くよりも良い方法はありますか?

編集:人の行を非アクティブに設定することにのみ興味があり、アクティブに設定することはありません。

4

2 に答える 2

18

カスケード外部キーを使用して説明したことを行うソリューションを次に示します。

mysql> create table city (
  id int not null auto_increment, 
  name varchar(45), 
  active tinyint, 
  primary key (id),
  unique key (id, active));

mysql> create table person (
  id int not null auto_increment, 
  city_id int,
  active tinyint, 
  primary key (id), 
  foreign key (city_id, active) references city (id, active) on update cascade);

mysql> insert into city (name, active) values ('New York', 1);

mysql> insert into person (city_id, active) values (1, 1);

mysql> select * from person;
+----+---------+--------+
| id | city_id | active |
+----+---------+--------+
|  1 |       1 |      1 |
+----+---------+--------+

mysql> update city set active = 0 where id = 1;

mysql> select * from person;
+----+---------+--------+
| id | city_id | active |
+----+---------+--------+
|  1 |       1 |      0 |
+----+---------+--------+

MySQL 5.5.31 でテスト済み。

于 2013-05-27T20:01:37.647 に答える
3

人をアクティブに定義する方法を再考する必要があるかもしれません..アクティブを2回定義する代わりに、それをcityテーブルに保持し、SELECTステートメントでPerson WHERE city.active = 1..を返すようにする必要があります。

しかし、もしあなたがしなければならないなら..あなたは次のようなことをすることができます:

UPDATE city C
LEFT JOIN person P ON C.id = P.city
SET C.active = 0 AND P.active = 0
WHERE C.id = @id
于 2013-05-27T19:45:37.003 に答える