MySQL の 6 つの一般的な制約タイプの詳細な説明

MySQL の 6 つの一般的な制約タイプの詳細な説明

序文

データ テーブルにデータを挿入する場合、生徒の成績を空にできない、生徒の ID 番号を繰り返すことができないなど、挿入されるデータに特別な要件がある場合があります。このような場合に制約が役立ちます。

制約タイプは、テーブルの行または列内のデータを制限することで、テーブル データの整合性と一意性を保証します。この章では、主に 6 つの一般的な MySQL 制約タイプを紹介します。

1. NULLではない

NULL 値が保存できないことを確認してください。NULL が挿入されると、挿入は失敗します。

2 つのデータ テーブル、student テーブルと student_copy テーブルを定義します。student テーブルは関連する制約を設定し、student_copy テーブルは制約を設定せずに比較テーブルとして使用され、2 つの違いを観察します。

学生テーブルでは、id は null ではないと定義されているため、id 行では NULL = NO となり、この行のデータは NULL にできないことを意味します。そうでない場合、挿入は失敗します。

student_copy テーブルには制約がないため、どのフィールドでも NULL = YES となり、ユーザーはエラーなしで自由に null 値を挿入できます。

Q: NULL を挿入すると NOT NULL 制約の下でエラーになることを明示的に指定することに加えて、暗黙的な NULL によってもエラーが発生しますか?

NULL を指定する方法は、明示的と暗黙的の 2 つがあります。

明示的とは、挿入時に列を NULL に設定することを意味し、暗黙的とは、挿入時に列に値を割り当てず、この列にデフォルト値が指定されていないことを意味します。システムのデフォルトは NULL であるため、これらすべての状況で挿入制御エラーが発生します。

2. ユニーク

列の各行に一意の値があることを確認します。つまり、指定された列の各データ行は繰り返すことができません。

次の 2 つの図は、student テーブルと student_copy テーブルに対する操作を示しています。student テーブルの id 列には一意制約が設定されているため、同じ id = 1 を挿入すると重複した操作が表示されます。

student_copy テーブルには制約がないため、ユーザーはエラーが発生することなく任意の値を挿入できます。

Q: 一意制約の下で NULL 値を挿入するとエラーが発生しますか?

実は、この問題は現在解決されています。id = NULL が学生テーブルに挿入されても、システムはエラーを報告しません。 Unique は、保存された値が一意であることのみを保証します。null 値にすることもできますが、null 値も一意である必要があります。NULL を挿入するとエラーが発生します。

3. デフォルト

列に値が割り当てられていない場合のデフォルト値を指定します。つまり、データが挿入されるときに、指定された列に値が割り当てられていない場合、その値はデフォルトで指定されたデフォルト値になります。

学生テーブルで名前フィールドを指定し、デフォルトの制約を設定すると、デフォルトの列に名前が設定されます。データを挿入するときに、名前列が指定されていない場合、名前列は、設定したデフォルト値 = 'Unnamed' に従って入力されます。

student_copy テーブルにはデフォルトの制約セットがないため、データが挿入されると、指定されていない列にはシステムのデフォルト値である NULL が入力されます。

4. 主キー

not null + unique の組み合わせにより、列に一意の識別子が与えられ、NULL 値を格納できなくなります。

最初のいくつかの制約タイプは複数の列に同時に設定できますが、主キーはテーブル内の 1 つの列のみを制約できます。主キー制約を使用する列は主キーと呼ばれます。

挿入されたデータが重複すると、次のデータの挿入は失敗し、挿入されたデータは NULL にできません。

テーブルでは主キーとして 1 つの列のみを持つことができ、同時に複数の列を主キーとして持つことはできません。テーブルを設計する場合、通常は主キーを設定するのが最適です。一般的な主キーは数値形式です。

自動増分主キー

実際の開発では、主キーが重複しないようにするための一連の戦略がよくあります。最も一般的な方法は、自動増分主キーを設定することです。システムが自動的にデータを割り当てることができ、同時にユーザーが手動で介入することもできます。MySQLには自動増分主キー機能が組み込まれているため、使い方は非常に簡単です。

下の図では、 id 列が自動増分主キーになるため、ユーザーはデータを挿入するときに手動で介入する必要がありません。

Q: 次の操作を実行すると、テーブルのクエリ結果がどうなると思いますか?

Id フィールドは自動増分主キーとして設定されていることがわかります。

Zhang San の id = null は、自動増分主キーが順序に従っているため、その id = 1 です。Li Si の id = 1 は、主キーを繰り返すことができず、Li Si の id は Zhang San の id と同じであるため、挿入は失敗します。Li Si のデータを挿入し続けます。今回は id = 4 に設定し、元のデータと重複がないため、挿入は成功します。Wang Wu の id = null は、自動増分主キーに従って、前の順序に従って下がり続けるため、その id = 5 です。

それでは結果を見てみましょう:

5. 外部キー

外部キーは他のテーブルの主キーと関連付けるために使用され、あるテーブルのデータが別のテーブルの値と一致するという参照整合性を保証します。

foreign key (字段名) references 主表(列)

これを理解するために例を見てみましょう。ここで 2 つのテーブルを作成し、それらを関連付けたいとします。どのようにすればよいでしょうか?

まず、この対応について考えてみましょう。1 人の生徒は 1 つのクラスに対応し、1 つのクラスは複数の生徒に対応します。生徒テーブルでは id が主キーなので、生徒の class_id を外部キーとして設定し、クラステーブルと関連付けることができます。

クラステーブルクラスを作成し、classesIdを主キーとして設定します。

テーブルクラスを作成する(
 id int 主キー auto_increment,
 名前varchar(20)
);

学生テーブルstudentを作成し、idを主キーとして設定します。

学生テーブルを作成 (
 id int 主キー auto_increment,
 名前varchar(20),
 クラスID int,
 外部キー (class_id) はクラス (id) を参照します。
);

MUL は外部キー制約を示します。

外部キーの使用ルール

学生テーブルに挿入されたクラス ID はクラス テーブルに存在する必要があります。

クラステーブルは空です。このとき、学生テーブルのデータを挿入し、class_id = 1 を指定しますが、クラステーブル内のクラス番号は空であるため、挿入は失敗します。学生テーブルで指定されている外部キー制約は、クラステーブルの主キーである必要があります。外部キー制約が確立された後、クラステーブル内のクラス ID を自由に変更または削除できなくなります。

学生テーブルの Zhang San はクラス テーブルの id = 1 の結果に依存しているため、クラス テーブルの id = 1 のレコードを id = 20 に変更することはできません。

外部キーの欠点

次のように製品と注文に関連する2つのテーブルがあるとします。

この時点で、注文テーブルの製品 ID と製品テーブルの製品 ID を使用して外部キー制約を確立できます。ただし、注文テーブルに製品 ID が 1 のレコードがある場合、製品テーブルの id = 1 のレコードは削除できません。すると、このデータは永続的に保存されますが、製品は永続的に存在しない可能性があり、棚から削除される可能性があります。これは、外部キーを使用して特定のテーブルを関連付ける場合に発生する矛盾です。

外部キー制約の検証機能が必要で、現在の矛盾も解決したい場合は、論理削除を実行できます。製品に別の列を追加してデータが有効かどうかをマークし、レコードが有効であることを示すために flag = 1 を設定し、レコードが無効であることを示すために flag = 0 を設定します。削除する製品については、そのフラグを直接 0 に変更できます。論理的には、製品は削除されていますが、実際にはデータはテーブルにまだ保存されており、実際の物理的な削除ではありません。

6. チェック

列内の値が指定された条件を満たしていることを確認します。

要約する

これで、MySQL の 6 つの一般的な制約タイプに関するこの記事は終了です。一般的な MySQL 制約タイプの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL で外部キー制約を作成および削除する方法
  • MySQL に外部キー制約を追加する具体的な方法
  • MySQL データベースの制約とデータ テーブルの設計原則
  • MySQLデータベースで外部キー制約を使用する必要があるかどうかの詳細な説明
  • MySQL 学習: データベース テーブルの 5 つの主要な制約を初心者向けに詳しく説明します
  • MYSQLの主キー制約とユニーク制約の違いについて簡単に説明します。
  • MySQL 制約の超詳細な説明
  • MySQL の null 制約のケースの説明
  • MySQLデータベースのテーブルに制約を設定する方法

<<:  ブロックレベル要素、インライン要素、可変要素の概要

>>:  変換を使用して純粋な CSS ポップアップ メニューを実装するためのサンプル コード

推薦する

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...

Docker 自動ビルド 自動ビルド実装プロセス図

自動ビルドとは、Docker Hub を使用して、Dockerfile ファイルを含む GitHub...

Linux/Mac MySQL パスワードを忘れた場合の対処方法

Linux/Mac の MySQL パスワードを忘れた場合はどうすればいいですか?心配しないでくださ...

mysql zipファイルのインストールチュートリアル

この記事では、参考までにMySQL zipファイルをインストールする具体的な方法を紹介します。具体的...

DockerにELKをインストールしてJSON形式のログ分析を実装する方法

ELKとは何ですか? ELK は、Elastic が提供するログ収集およびフロントエンド表示ソリュー...

docker runの--rmオプションの使用方法

Docker コンテナが終了しても、デバッグを容易にし、ユーザー データを保持するために、デフォルト...

MySQL での Join の使用に関する詳細な説明

前の章では、1 つのテーブルからデータを読み取る方法を学習しました。これは比較的簡単ですが、実際のア...

jsネイティブ構文プロトタイプ、__proto__、コンストラクタの徹底的な理解

目次1 はじめに2 前提条件2.1 データ型2.2 それが自身のプロパティであるかどうかを判断する ...

Nodejs のグローバル変数とグローバルオブジェクトの知識ポイントと使用方法の詳細

1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...

jsは配列の平坦化を実装します

目次配列をフラット化する方法1.flat() の使用2. 正規表現を使用する3.reduce()+c...

ラムダ式の原則と例

ラムダ式ラムダ式 (クロージャとも呼ばれる) は、Java 8 のリリースを推進した最も重要な新機能...

iframe が HTML 内のページにジャンプするのを防ぎ、iframe を使用して WeChat Web バージョンをページに埋め込む方法

私は、WinForm と HTML5 を組み合わせた小さなものを作りたいだけなのですが、突然、そこに...

CSSアダプティブレイアウトは、サブ要素項目の全体的な中央揃えと内部項目の左揃えを実現します。

日常業務では、次のようなレイアウトに遭遇することがあります。親要素のフレーム (ブラウザのサイズに応...

大きな太陽の天気アイコンを純粋な CSS で記述する方法の例

効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...