1

すべてのユーザーが MySQL を使用して中央データベースのデータにアクセスする必要があるアプリケーションを作成していますが、何か疑問に思っていました。

この設定があるとしましょう。

CREATE TABLE A
(
    id   INT PRIMARY KEY AUTO_INCREMENT,
    data INT NOT NULL;
);

CREATE TABLE B
(
   id    INT PRIMARY KEY AUTO_INCREMENT,
   a_id  INT,
   FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE SET NULL
);

ここで、私がこの設定を希望する方法は、テーブル A はテーブル B の行によって常に参照される必要があるということです。ただし、テーブル B の行はテーブル A の行を参照する場合と参照しない場合があります。その関係は 1:n です。テーブル B の複数の行は、テーブル A の単一の行を参照できます。テーブル B のどの行からも参照されなくなった場合、MySQL データベースが A の行を自動的に削除できるかどうか疑問に思っています。

ここでの考え方は、単純にテーブル B の a_id を NULL に設定し、データベースに残っているものをクリーンアップできるということです。今考えるとJavaのガベージコレクションに似ていると思います。制約を自動的に適用するキーがない場合、更新後に実行されるトリガーは機能しますか?

編集:追加の関係制約を追加します。

4

2 に答える 2

1

次のクエリを特定の間隔で実行します。

DELETE tableA
FROM tableA LEFT JOIN tableB B ON A.id = B.a_id
WHERE B.a_id IS NULL;

または、リアルタイムの一貫性を維持するために、tableB で同様に実行する OnChange トリガーを作成することもできます。

于 2011-05-24T19:58:35.257 に答える
0

使用しているテーブル構造に理由はありますか? あなたが外部キーを使用している方法は、私には逆に見えます。キーをテーブル B に配置する代わりに、テーブル A に移動できます。

これにより、次のような構造が得られます。

tableA columns        tableB columns
  id
  b_id                id
  [values]            [values]

  fk: a.b_id=b.id

テーブル A にレコードを追加するには、テーブル B に対応するフィールドが必要ですが、B はテーブル A に値を持たなくてもかまいません。テーブル A の値を消去したい場合は、次のように単純に使用できます。

delete from tableA where b_id=[recordIdToNull];

A の外部キーを設定して、B で実行されるアクションをカスケードすることもできるため、B から値を削除すると、A の対応する行も削除されます。

于 2011-05-24T19:11:55.380 に答える