ホームページ >データベース >mysql チュートリアル >MySQL で外部キー制約を設定するにはどうすればよいですか?

MySQL で外部キー制約を設定するにはどうすればよいですか?

青灯夜游
青灯夜游オリジナル
2019-05-20 18:04:2215060ブラウズ

MySQL で外部キー制約を設定するにはどうすればよいですか?

MySQL 外部キー制約 (FOREIGN KEY) は、2 つのテーブルのデータ間のリンクを確立するために使用されます。1 つの列または複数の列にすることができます。テーブルには 1 つ以上の外部キーを含めることができます。

外部キーは参照整合性に対応します。テーブルの外部キーは null にすることができます。null でない場合、各外部キーの値は、別のテーブルの主キーの特定の値と等しくなければなりません。

外部キーはテーブルのフィールドであり、このテーブルの主キーではありませんが、別のテーブルの主キーに対応します。外部キーを定義した後は、別のテーブル内の関連する行を削除することはできません。

外部キーの主な機能は、データの一貫性と整合性を維持することです。たとえば、部門テーブル tb_dept の主キーは id で、従業員テーブル tb_emp5 にはこの ID に関連付けられたキー deptId があります。主テーブル (親テーブル): リレーションシップが関連付けられている 2 つのテーブルの場合、関連付けられたフィールドに主キーを持つテーブルが主テーブルになります。従属テーブル (サブテーブル): 関連付けられたリレーションシップを持つ 2 つのテーブルの場合、関連付けられたフィールドの外部キーが配置されているテーブルがセカンダリ テーブルになります。

#MySQL 外部キー制約を設定するフィールドを選択してください

外部キーを定義するときは、次のルールに従う必要があります:

親テーブルはデータベース内に存在する必要があります。そうでない場合は、現在作成中のテーブルです。後者の場合、親表と子表は同一の表となり、このような表を自己参照表と呼び、この構造を自己参照整合性と呼びます。

主キーは親テーブルに定義する必要があります。

主キーには null 値を含めることはできませんが、外部キーでは null 値が許可されます。つまり、外部キーのすべての非 null 値が指定された主キーに出現する限り、外部キーの内容は正しいことになります。

親テーブルのテーブル名の後に列名または列名の組み合わせを指定します。この列または列の組み合わせは、親テーブルの主キーまたは候補キーである必要があります。

外部キーの列数は、親テーブルの主キーの列数と同じである必要があります。

外部キーの列のデータ型は、親テーブルの主キーの対応する列のデータ型と同じである必要があります。

テーブル作成時に外部キー制約を設定する

FOREIGN KEY キーワードを使用して、データ テーブルに外部キーを作成します。特定の構文ルール

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

その内: 外部キー名は、定義された外部キー制約の名前です。テーブル内に同じ名前の外部キーがあってはなりません。フィールド名は、そのフィールドの列を示します。サブテーブルに外部キー制約を追加する必要があります。メインテーブルの名前、つまり、サブテーブルの外部キーが依存するテーブルの名前。主キー列は、定義された主キー列または列の組み合わせを表します。メインテーブルにあります。

例: テーブル間の外部キー関係を示すために、この例では test_db データベースに部門テーブル tb_dept1 を作成します。テーブル構造は次の表のようになります。

SQL ステートメントを実行して tb_dept1 を作成した結果は次のとおりです。

mysql> CREATE TABLE tb_dept1
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(22) NOT NULL,
    -> location VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.37 sec)

データ テーブル tb_emp6 を作成し、テーブル tb_emp6 に外部キー制約を作成して、そのキー deptId が外部キーとしてテーブル tb_dept1 の主キー ID に関連付けられるようにします。入力 SQL ステートメントと実行結果は以下の通り。

mysql> CREATE TABLE tb_emp6
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> CONSTRAINT fk_emp_dept1
    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)

上記のステートメントが正常に実行されると、fk_emp_dept1 という名前の外部キー制約がテーブル tb_emp6 に追加されます。外部キー名は deptId で、テーブル tb_dept1 の主キー ID に依存します。

ヒント: 関連とは、リレーショナル データベース内の関連するテーブル間の接続を指します。これは、同じ属性または属性のグループによって表されます。子テーブルの外部キーは、親テーブルの主キーに関連付けられている必要があり、関連付けられたフィールドのデータ型が一致している必要があります。型が異なる場合、エラー「

ERROR 1005 (HY000): Can'」が表示されます。子テーブルを作成するときに「t create table」が発生します。database.tablename'(errno:150)"。

#テーブル変更時の外部キー制約の追加データ テーブル変更時に外部キー制約を追加するための構文ルールは次のとおりです。

ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

例:

データ テーブル tb_emp2 を変更し、フィールド deptId を外部キーとして設定し、それをデータ テーブル tb_dept1 の主キー ID に関連付けます。入力 SQL ステートメントと実行結果は次のとおりです。が続きます。

mysql> ALTER TABLE tb_emp2
    -> ADD CONSTRAINT fk_tb_dept1
    -> FOREIGN KEY(deptId)
    -> REFERENCES tb_dept1(id);
Query OK, 0 rows affected (1.38 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`),
  CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.12 sec)

外部キー制約の削除

データベースに定義されている外部キーは、不要になった場合は削除できます。外部キーが削除されると、マスター テーブルとスレーブ テーブルの関連付けが解除されます。MySQL で外部キーを削除するための構文形式は次のとおりです:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

例:

データテーブルtb_emp2の外部キーを削除 キー制約fk_tb_dept1、入力SQL文と実行結果は以下のとおりです。

mysql> ALTER TABLE tb_emp2
    -> DROP FOREIGN KEY fk_tb_dept1;
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)
FOREIGN KEY が tb_emp2 に存在しなくなり、fk_emp_dept という名前の元の外部キー制約が正常に削除されたことがわかります。

以上がMySQL で外部キー制約を設定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。