14

誰かが SQL キーワード REFERENCES の目的を説明してくれることを期待していました

CREATE TABLE wizards(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT,
  age INTEGER
, color TEXT);

CREATE TABLE powers(
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name STRING,
  damage INTEGER,
  wizard_id INTEGER REFERENCES wizards(id)
);

私はこれを調べようと多くの時間を費やしましたが、最初は、powers テーブルに入力できるデータのタイプを制限するだろうと考えていました (wizard_id かどうかに基づいて)。ただし、まだ両方にデータを挿入できます私が気づいた制約のない列。

では、キーワード REFERENCES はクエリの速度を上げるためだけのものなのでしょうか? その真の目的とは?

ありがとう

4

2 に答える 2

14

他のテーブルへの外部キーを作成します。これによりパフォーマンスが向上する可能性がありますが、外部キーは主にデータの整合性に関するものです。これは、(あなたの場合)のフィールドには、テーブルのフィールドに存在する値wizard_idpowers必要であることを意味します。つまり、権限は有効なウィザードを参照する必要があります。多くのデータベースは、この情報を使用して削除やその他の変更を伝達するため、テーブルの同期が維持されます。idwizards

これに気づいただけです。キー制約をバイパスできる理由は、外部キーが有効になっていない可能性があります。SQLite3 ドキュメントの外部キーの有効化を参照してください。

于 2013-10-04T16:42:19.190 に答える
0

私が集めたものから、 を使用する主な利点は 2 つあり、 をREFERENCES使用する場合と使用しない場合で重要な違いがありますFOREIGN KEY

DBMS に最適化の余地を与える

REFERENCES を使用しないと、SQLite は属性idと属性wizard_idが機能的に同等であることを認識できません。データベース管理システム (この場合は SQLite) に対して定義できる既知の制約が多いほど、内部でデータを処理する方法を最適化する自由度が高くなります。

優れた実践を強制または奨励することができます

参照宣言は、強制や警告規定にも役立ちます。たとえば、 と の 2 つのテーブルがAあり、それが と機能的に同等Bであると仮定して、結合を試みるとします。これら 2 つの属性間の機能上の同等性を示すために REFERENCE が使用されていない場合、DBMS は、結合を行うときに警告を表示できます。同じこと。A.nameB.nameSELECT * FROM A, B WHERE A.name = B.name

REFERENCES常に「外部キー」を作成するとは限りません

すでに提案されていることとは反対に、参照と外部キーは同じものではありません。参照は、属性間の機能的同等性を宣言します。外部キーは、別のテーブルの主キーを参照します。

編集: @IanMcLaird は私を修正しました: を使用すると、REFERENCES常に何らかの外部キーが作成されますが、これは、「別のテーブルの主キーを参照するテーブル内の属性のセット」としての一般的な外部キーの定義と競合します。 (ウィキペディア)。

REFERENCESwithoutを使用FOREIGN KEYすると、「外部キー」の一般的な定義に反して動作する「列レベルの外部キー」が作成される場合があります。

次のステートメントには違いがあります。

driver_id INT REFERENCES Drivers

driver_id INT REFERENCES Drivers(id)

driver_id INT,
FOREIGN KEY(driver_id) REFERENCES Drivers(id)

Drivers最初のステートメントは、属性が指定されていないため、主キーを参照することを前提としています。3 番目のステートメントでは、idが の主キーである必要がありDriversます。どちらも、上記の一般的な定義によって外部キーを作成することを前提としています。どちらもテーブル レベルの外部キーを作成します。

2 番目のステートメントはトリッキーです。の主キーである属性を指定する場合Drivers、DBMS はテーブル レベルの外部キーの作成を選択する場合があります。ただし、指定された属性はの主キーである必要はありませDrivers。そうでない場合、DBMS は列レベルの外部キーを作成します。これは、データベースに初めて取り組み、「外部キー」の一般的な定義の柔軟性に欠けることを学ぶ人にとっては、やや直感的ではありません。

一部の人々は、これら 3 つのステートメントを同じものであるかのように使用する場合があり、多くの一般的なユース ケースでは機能的に同一である可能性がありますが、同じではありません。

とはいえ、これは私の理解です。私はこのテーマの専門家ではありません。追加、訂正、確認をいただければ幸いです。

于 2021-04-30T01:01:48.853 に答える