[MySQL] この記事では、データベースの制約について理解します。

1. 制約の種類

役割:
データベース制約は、データ入力またはデータ更新を制限するために使用されるルールです。データベース制約により、ルールに適合するデータのみをテーブルに挿入できるようになり、データの整合性と一貫性が保証されます。
一般的なデータベース制約には次のものがあります。

  1. 主キー制約: テーブル内のデータの各行を一意に識別し、データの一意性と整合性を確保するために使用されます。

  2. 外部キー制約: テーブル間のデータ関係の正確性を確保し、参照されるテーブルのデータが参照されるテーブルに存在する必要があることを確認するために使用されます。

  3. Not Null 制約: 列の値が Null でないことを保証するために使用されます。

  4. 一意の制約: 列内の値が重複しないようにするために使用されます。

  5. デフォルト制約: デフォルト値の設定に使用されます。データの挿入時に値が指定されていない場合、データベースはデフォルト値を使用します。

  6. チェック制約: 列の値が特定の条件または式を満たしていることを確認するために使用されます。

  7. トリガー制約: データの挿入または削除時の操作の実行など、特定の状況下で操作を自動的に実行するために使用されます。

2. PRIMARY KEY: 主キー制約

概念:
主キー制約は、テーブル内の各行の一意の識別を制限するために使用されるデータベース制約です。主キー制約は、テーブル内の各行の一意性を保証し、他のテーブルとこのテーブル間の関係の基礎として機能します。各テーブルは主キー制約を 1 つだけ持つことができ、主キー制約の値は一意である必要があり、空であってはなりません。
主キー制約は、テーブルの作成時、または既存のテーブルに追加するときに定義できます。
例:
1. 「student」という名前のテーブルを作成する場合、「id」列に主キー制約を定義できます。
主キー制約
このとき、要素を追加するとき、id の値は空ではなく一意である必要があります。
主キーの例
>2. テーブルが作成された時点では、テーブル内のどの列にも主キー制約がありませんが、次の方法で主キー制約を実行することもできます。この制約方法は前者ほど優れたものではなく、制約する列に null または重複した要素がある場合、主キー制約は失敗することに注意してください
制約


失敗

上記で使用したコード:

mysql> create table student(id int primary key, name varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into values(null,'张三');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values(null,'张三')' at line 1
mysql> insert into student values(null,'张三');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student values('张三');
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(1,'李四');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql> insert into student values(2,'李四');
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 | 张三 |
|  2 | 李四 |
+----+------+
2 rows in set (0.00 sec)

3. FOREIGN KEY: 外部キー制約

概念:
外部キー制約は、テーブル間のデータの一貫性を維持するために使用される制約で、2 つのテーブル間に 1 対多の関係を確立します。外部キー制約により、あるテーブルのデータが別のテーブルのデータに関連付けられることが保証されます。関連付けられていない場合、制約エラーがトリガーされます。
外部キー制約は、テーブルの作成時に定義したり、既存のテーブルに追加したりすることもできます。
例:
外部キー制約は、テーブルの作成時に定義したり、既存のテーブルに追加したりすることもできます。
以下の図は、外部キー制約を定義しています:
外部キー
外部キー制約は通常、2 つのテーブル間に 1 対多の関係を確立するために使用されます。上の図では、student テーブルの class_id 列が外部キーであり、クラステーブルリストのID。この外部キー制約により、student テーブルの class_id 列の値は、class テーブルの id 列の値からのみ選択できることが保証され、選択できない場合はエラーが報告されます。
制約

上記で使用したコード:

mysql> create table class(id int primary key, name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> create table student(id int primary key, name varchar(20), class_id int,
    -> foreign key (class_id) references class(id));
Query OK, 0 rows affected (0.02 sec)

mysql> desc student;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(11)     | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| class_id | int(11)     | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> insert into class values(1, '软件工程'),(2, '计科');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into student values(20211,'张三',1);
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(20212,'李四',2);
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(20213,'王五',3);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`xiaoc`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

4. NOT NULL: 非NULL制約

概念:
非 null 制約は、列の値が null でないことを保証するために使用される制約です。列に非 null 制約が定義されている場合、データの挿入または更新時に列に非ヌル値を指定する必要があります。そうしないと、非ヌル値制約エラーがトリガーされます。
例:
テーブルを作成するときに、列に非 null 制約を定義できます。次のコードは、student という名前のテーブルを定義します。このテーブルでは、id 列が非 null 制約として定義されています。この時点で空の要素が挿入されると、
エラーが報告されます。
非NULL制約

空でないエラー

上記で使用したコード:

mysql> create table student(id int not null, name varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(null,'李四');
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into student values('李四');

5. UNIQUE: 一意の制約

概念:
一意制約は、列内の値が一意であることを保証するために使用される制約です。列に一意制約が定義されている場合、列内の値は一意である必要があり、重複した値は許可されません。一意制約を使用すると、テーブル内の列または列の組み合わせに重複する値が存在しないようにすることができます。
例:
テーブルを作成するときに、列の一意制約を定義できます。
次のコードは、users という名前のテーブルを定義します。
それだけ
このテーブルでは、email 列が一意制約として定義されています。上記の例では、student テーブルの id 列が一意制約として定義されているため、student テーブルにデータを挿入する操作はすべて、 id 列の値が一意であることを確認する必要があります。
唯一のエラー

上記で使用したコード:

mysql> create table student(id int unique,name varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | UNI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into student values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(2,'李四');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student values(2,'威威');
ERROR 1062 (23000): Duplicate entry '2' for key 'id'

5. DEFAULT: デフォルト値の制約

概念:
デフォルト値制約は、新しい行がテーブルに挿入されるときに、列に特定の値が指定されていない場合、その列は事前定義されたデフォルト値を使用することを意味します。デフォルト値には、文字列、数値、日付などの任意の定数または式を指定できます。列にデフォルト値制約が定義されている場合、INSERT 操作の実行時に列に特定の値が指定されていない場合は、デフォルト値が自動的に使用されます。
例:
テーブルを作成するときに、列のデフォルト値制約を指定できます。たとえば、次のコードは、student という名前のテーブルを作成します。ここで、name 列がデフォルトの制約として定義されています:
デフォルト
null を挿入するとき。
デフォルト

上記で使用したコード:

mysql> create table student(id int, name varchar(10) default '陌路人');
Query OK, 0 rows affected (0.02 sec)

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | 陌路人  |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into student(id) values(1),(2);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into student values(3,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> select * from student;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 陌路人 |
|    2 | 陌路人 |
|    3 | 张三   |
+------+--------+
3 rows in set (0.00 sec)

6. 要約する

データベース制約はデータベース設計における重要な概念です。これにより、データの整合性、一貫性、正確性、セキュリティが効果的に保証され、開発者がデータをより適切に管理および保守できるようになります。したがって、制約を習得することは非常に重要です。
上記は一般的に使用される制約です。また次回お会いしましょう。

おすすめ

転載: blog.csdn.net/weixin_73392477/article/details/131130201
おすすめ