9

ブログに次のような「カテゴリ」テーブルがあるとします。

CREATE TABLE categories
(
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  parent_id INTEGER NOT NULL,
  name VARCHAR(30) NOT NULL,
  description TEXT,
  count INTEGER NOT NULL DEFAULT 0
);

また、parent_id フィールドがカテゴリ テーブルの 'id' フィールドを参照することを意図している場合、parent_id に挿入された値が id フィールドを参照することを保証する制約を追加するにはどうすればよいでしょうか?

新しく挿入されたカテゴリの親として、存在するカテゴリ ID 値のみを使用できるようにしたいだけです。

4

3 に答える 3

14

はい、同じテーブル内の列を参照できます。

ただし、その列は null 可能にする必要があります。そうしないと、最初のレコードを挿入できません。

CREATE TABLE categories
(
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  parent_id INTEGER NULL,
  name VARCHAR(30) NOT NULL,
  description TEXT,
  count INTEGER NOT NULL DEFAULT 0,
  FOREIGN KEY (parent_id) REFERENCES categories(id)
);

REFERENCES キーワードの後のテーブル名はオプションではないため、同じテーブル内の列を参照している場合でも指定する必要があることに注意してください。ドキュメントから:

参照定義:
    リファレンス tbl_name (index_col_name,...)
      [マッチフル | 部分一致 | マッチシンプル】
      [ON DELETE reference_option]
      [ON UPDATE参照_オプション]

オンラインで動作することを確認してください: sqlfiddle

于 2012-07-12T20:10:03.590 に答える
2

通常の外部キーを使用するだけです:

ALTER TABLE categories ADD CONSTRAINT FK_categories_Parent_ID 
REFERENCES categories (ID)

ただし、レコードを挿入することはできないため、Parent_ID は null 可能にする必要があります。

于 2012-07-12T20:12:04.027 に答える
0

以下のリンクを使用できます。Oracleデータベースでそれを行う方法があります。

http://www.adp-gmbh.ch/ora/data_samples/hierarchic_yahoo.html

ありがとう

于 2012-07-12T20:12:31.777 に答える