PhpMyAdminを使ってデータベースを設定しています。私は2つのテーブル(foo
とbar
)を持っています、 それらの主キーでインデックスされています 。主キーを外部キーとして使用して、それらの間にリレーショナルテーブル(foo_bar
)を作成しようとしています。
MyISAMとしてこれらのテーブルを作成しましたが、MyISAMは外部キーをサポートしていないことを読んだので、3つすべてをInnoDBに変更しました。すべてのid
フィールドはINT(11)
です。
foo_bar
テーブルを選択したら、 "relation view"リンクをクリックし、FK列をdatabase.foo.id
とdatabase.bar.id
に設定しようとします。 "No index defined!"と表示されます。 各列の横にあります。
何が足りないの?
簡単にするために、phpMyAdminを使い続けたいと思います。私は現在XAMPPを使用しています。これはPHP/CSS/Javascriptに集中するのに十分なほど簡単で、phpMyAdminが付属しています。
また、明示的な外部キーをまだ設定することはできませんでしたが、リレーショナルテーブルがあり、次のような結合を実行できます。
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
データベースにFKが明示的に定義されていないのは、私を不快にするだけです。
PhpMyAdminを使用して関係を設定したい場合は、2つのことをする必要があります。まず第一に、あなたは参照テーブルの外部キーカラムにインデックスを定義しなければなりません(だからあなたのケースではfoo_bar.foo_idです)。次に、(参照テーブル内の)リレーションビューに移動して、参照列(その場合はfoo.id)を選択し、on updateアクションとon deleteアクションを選択します。
複数のテーブルを互いにリンクしている場合、特に参照オプションを正しく設定すると削除スクリプトが非常に短くなるので、外部キーは便利だと思います。
編集:両方のテーブルでInnoDBエンジンが選択されていることを確認してください。
phpMyAdminでは、「リレーション」ビューを使って外部キーを定義できます。しかし、MySQLは "INNO DB"テーブルに対する外部制約のみをサポートしているので、最初のステップはあなたが使用しているテーブルがそのタイプであることを確認することです。
CHILDという名前のテーブルのPID列がPARENTという名前のテーブルのID列を参照するように外部キーを設定するには、次のようにします。
CHILDテーブルでエクスポートを実行すると、PID列に外部キー制約が作成されたことがわかります。
これはウィキペディアの記事の要約です。これはPHPmyadminで規定できるさまざまな種類の関係を指定します。それは「更新時または削除時」の外部キーオプションの設定に関する@ Nathanのコメントに関連しているため、ここに入れていますが、コメントには大きすぎます。
_カスケード_
マスター(参照)テーブルの行が削除(または更新)されるたびに、一致する外部キーカラムを持つ子(参照)テーブルの各行も削除(または更新)されます。これはカスケード削除と呼ばれます(それぞれupdate [2])。
_制限_
被参照表の値を参照する外部キー表に行が存在する場合、値を更新または削除することはできません。同様に、外部キーテーブルからその行への参照がある限り、その行を削除することはできません。
何もしない
行動も制限も非常によく似ていません。 NO ACTIONとRESTRICTの主な違いは、NO ACTIONを指定すると、テーブルを変更しようとした後に参照整合性チェックが行われることです。 RESTRICTは、UPDATEまたはDELETEステートメントを実行しようとする前にチェックを行います。参照整合性チェックが失敗した場合、両方の参照アクションは同じように機能します。UPDATEまたはDELETEステートメントはエラーになります。
SET NULL
参照行が更新または削除されると、参照行の外部キー値はNULLに設定されます。これは、参照テーブル内のそれぞれの列がNULL可能である場合にのみ可能です。 NULLのセマンティクスのため、外部キーカラムにNULLを含む参照行は参照行を必要としません。
デフォルト設定
SET NULLと同様に、参照行が更新または削除されると、参照行の外部キー値は列のデフォルトに設定されます。
データベースに新しいもの....そして既存のテーブルを変更する必要があります。多くのことがかなり簡単に思えますが、AとBの間には常に何かがあります。
何よりも先に、 this を見てください。
[SQL]タブに移動し(私はphpMyAdminを使用しています。他のものも同様であるはずです)、次のコマンドを実行します。
ALTER TABLE child_table_name
ADD FOREIGN KEY (P_ID)
REFERENCES parent_table_name (P_ID)
構造ではなく子テーブルをクリックし、最後にリレーショナルビューをクリックします。そこでDB計画を完成させます。この前に、カスケード、制限などについていい答えがありました。もちろん、それはコマンドで実行できます。
外部キーはテーブルの素数でない属性が別の素数属性を参照することを意味します * in phpMyAdmin *最初に外部キーをインデックスとして設定したいカラムを設定します
それからRELATION VIEWをクリックしてください
外部キーを設定するためのオプションがあります。
InnoDBでは、ALTER TABLEを使用してテーブルに新しい外部キー制約を追加することができます。
ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
一方、MyISAMがInnoDBよりもあなたのコンテキストで利点がある場合、なぜあなたは外部キー制約を全く作成したいのでしょうか。アプリケーションのモデルレベルでこれを処理できます。外部キーとして使用したいカラムがインデックスされていることを確認してください。
2つの列が同じデータ型を持つべきであることを忘れないでください。
たとえば、一方の列がINT型で、もう一方の列がtinyint型の場合、次のエラーが発生します。
[PID列]で外部キーを作成中にエラーが発生しました(データ型を確認してください)
ステップ1:mysql設定ファイルの[mysqld]セクションの下にdefault-storage-engine = InnoDBという行を追加し(OSによってmy.cnfまたはmy.ini)、mysqldサービスを再起動する必要があります。
ステップ2:テーブルを作成すると、テーブルの種類がわかります。InnoDB
手順3:親テーブルと子テーブルの両方を作成します。子テーブルを開いて、外部キーを保持する列Uを選択します。以下に示すように、アクションラベルからインデックスキーを選択します。
ステップ4:次に、下図に示すように、印刷ビューの近くの下から同じ子テーブルの関係ビューを開きます。
ステップ5:ドロップダウンから[親列を選択]のように外部キーを持つ列Uを選択します。 dbName.TableName.ColumnName
https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html にある公式のMySQLドキュメントから。
MySQLは外部キーと参照キーのインデックスを必要とするので、外部キーのチェックは速くなり、テーブルスキャンを必要としません。