MySQL 整合性制約の定義と例のチュートリアル

MySQL 整合性制約の定義と例のチュートリアル

整合性制約

整合性制約の定義

挿入されたデータの正確性と合法性を保証するために、データ型の制約に加えて、テーブル内のフィールドに他の制約を追加します。

整合性制約の分類

エンティティの整合性: レコード間で重複があってはなりません。

  • 主キー制約: 一意であり、空にできない
  • 一意制約: null のみ可能
  • 主キーの自動増分

ドメイン整合性: データベース テーブルのフィールドは、特定のデータ型または制約に準拠する必要があります。

  • 型制約: テーブルを作成するときに、各フィールドに型が追加されます。
  • 非 null 制約: 非 null
  • デフォルト値: デフォルト

参照整合性: あるテーブル内のフィールドの値は、別のテーブル内の値を参照する必要があります。

  • 外部キー制約の追加: 外部キー
  • 参照整合性は SQL 実行の効率を低下させるため、使用しない方がよい場合もあります。

主キー制約

  • 主キー制約: 一意であり、空にすることはできません。
  • テーブルには主キー フィールドを 1 つだけ持つことができますが、複合主キーを持つことができます。

主キー制約を追加するには、次の 3 つの方法があります。

方法 1: テーブルの作成時に主キー制約を追加します。
テーブル学生を作成(
    sid int 主キー、
    sname varchar(20)、
    年齢 int
)文字セット=utf8;
-- 主キー制約を追加した後、同じ sid を挿入するとエラーが発生します。
学生(sid,sname,age)に値(1,'张三',22)を挿入します。
学生(sid,sname,age)に値(1,'李四',33)を挿入します。

方法 2: テーブルの作成時に主キー制約を追加しますが、追加方法が異なります。
  「主キーを追加するこの方法のみが複合主キーを追加できます」
テーブル学生を作成(
    sid int、
    sname varchar(20)、
    年齢 int、
    主キー(sid)
)文字セット=utf8;

方法 3: テーブルを作成した後、主キー制約を追加します。
テーブル学生を作成(
    sid int、
    sname varchar(20)、
    年齢 int
)文字セット=utf8;                  
テーブルstudentを変更し、主キー(sid)を追加します。
-- 制約は制約が追加されることを意味します。      
-- pk_sid は制約の名前です。

単一の主キーと複合主キーの違い

「単一の主キー」
    テーブル内のフィールドを主キーとして設定し、このフィールドを使用してレコードを一意に識別します。
    sid が一意であり空でない限り、各行は一意のレコードになります。
    主キー(sid)
    sid sname 年齢
    1 張三18
    2 張三18  

「共同主キー」
    テーブル内の2つのフィールド(または複数のフィールド)を共同主キーとして設定し、これらの2つのフィールド(または複数のフィールド)を使用して、
    レコードを一意に識別します。
    これら 2 つのフィールドは、同時に繰り返されない限り、別々に繰り返すことができます。
    主キー (sid、classid)
    sid クラスid sname 年齢
    1 2 張三18
    1 3 張三18  
    2 4 リチウムSi20
    3 4 王武 30
    -- 次の 2 つのレコードには同じフィールドがあるため、重複レコードとなり、挿入時にエラーが発生します。
    5 5 李創25  
    5 5 王二24

主キーフィールドを選択するための原則

  1. 通常、主キー フィールドには意味のないフィールドが選択されます。たとえば、テーブル内の各行の行番号を記録する id フィールドは意味のないフィールドであり、主キーとして非常に適しています。
  2. 主キー フィールドは通常変更されません (フィールド名、フィールド タイプなど)
  3. 頻繁に変更されるフィールド、意味のあるフィールド、主キーとしては適さない

特別な注意: テーブル作成ステートメントのフィールドに主キー制限のみがあり、主キーauto_incrementを使用しない場合
主キーフィールドに自分で値を挿入する必要があります。そうしないと、次のエラーが発生します。 「エラー 1364 (HY000): フィールド 'sid' にデフォルト値がありません」

ただし、上で述べたように、主キー フィールドは通常は変更されないため、積極的に値を指定しないでください。主キー フィールドには、システムによって既定値が割り当てられます。主キーの自動増分について学習すると、これが理解できるようになります。

覚えておいてください: 主キーと auto_increament は一緒に使用するのが最適です。

例えば:

主キー制約の削除

テーブル student を変更し、主キーを削除します。


主キーの自動増分

主キー自動増分の意味と特徴

名前が示すように、これは主キーが自動的に値を追加するのに役立つ制約です。上で述べたように、主キー フィールドには変更を加えないことが最善です。もちろん、これには、主キー フィールドに値を挿入するときに主キーを手動で追加しないことも含まれます。代わりに、システムが主キー フィールドに値を自動的に割り当てるようにします。主キーの自動インクリメントには、次の 2 つの特性があります。

  1. 主キーの自動増分を設定すると、主キーの値は 1 から始まり、毎回 1 ずつ増加します。
  2. 行レコードを削除した後も、以前使用した主キー値は新しい値のまま残り、以前使用した主キー値は再利用されません。

2 番目の機能の説明:

一意制約を追加するには、次の 2 つの方法があります。

方法 1: テーブルを作成するときに、主キーと主キーの自動増分を同時に追加します。 
テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20)、
   年齢 int、
   idカードvarchar(18) 
)文字セット=utf8;  
-- データを挿入するときは、主キーと auto_increment を一緒に使用します。
-- 主キーフィールド sid に値を割り当てる必要はありません。
insert into student(sname,age) values ​​("张三",22),("李四",25);

方法 2: テーブルを作成した後、フィールドに「主キーと主キーの自動増分」を同時に追加します。
テーブル学生を作成(
   sid int、
   sname varchar(20)、
   年齢 int、
   idカードvarchar(18) 
)文字セット=utf8;  
-- 次の 2 つの方法では、フィールドに「主キーと主キーの自動増分」を同時に追加できます。
テーブル student を変更し、 sid int 主キー auto_increment を変更します。
テーブル student を変更し、sid sid int 主キー auto_increment を変更します。

主キーの自動増分を削除する

テーブル student を変更し、sid int 主キーを変更します。

一意制約

ユニーク制約とは何を意味しますか?

テーブルには主キーが 1 つしか存在できないためです。しかし、ID カード フィールドなどの一部のフィールドは一意である必要があります。それらを主キーとして設定することはできません (ID カード フィールドは意味のあるフィールドです)。では、それらの一意性をどのように保証すればよいでしょうか?これは次に説明する唯一の制約です。注: テーブルには複数の一意制約を設定できます。

一意制約を追加するには、次の 3 つの方法があります。

方法 1: テーブルの作成時に一意制約を追加します。
テーブル学生を作成(
    sid int 主キー キー auto_increment,
    sname varchar(20)、
   年齢 int、
   idcard varchar(18) ユニーク
)文字セット=utf8; 


方法 2: テーブルの作成時に、異なる方法で一意制約を追加します。
  「主キーを追加するこの方法のみが複合主キーを追加できます」
学生テーブルを作成 (
    sid int 主キー auto_increment,
    sname varchar(20)、
    年齢 int、
    idcard varchar(18)、
    ユニーク(IDカード)
)文字セット=utf8; 

方法 3: テーブルを作成した後、一意制約を追加します。
学生テーブルを作成 (
    sid int 主キー auto_increment,
    sname varchar(20)、
    年齢 int、
    idカードvarchar(18)
)文字セット=utf8;                      
テーブルstudentを変更し、unique(idcard)を追加します。

-- 一意制約が設定されたフィールドの場合、同じ値が挿入されるとエラーが報告されます。
insert into student(sname,age,idcard) values ​​("李四",18,"123456");
insert into student(sname,age,idcard) values ​​("王五",22,"123456");

ユニーク制約の削除

一意制約を削除するには、使用するステートメントが若干異なります。
テーブルを変更して学生のキー ID カードをドロップします。

非NULL制約を追加する

非NULL制約の追加

非 null 制約とは、フィールドに非 null 制約を設定した後、フィールドに null 値を挿入するとエラーが報告されることを意味します。非 null 制約を追加するには、次の 2 つの方法があります。

方法 1: テーブルを作成するときに、フィールドに NOT NULL 制約を追加します。 
テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20) が null ではない、
   年齢 int、
   idカードvarchar(18) 
)文字セット=utf8;

方法 2: テーブルを作成した後、フィールドに NOT NULL 制約を追加します。
テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20)、
   年齢 int、
   idカードvarchar(18) 
)文字セット=utf8;

-- 追加方法は2つあります。
alter table student sname varchar(20) が null でないを変更します。
alter table student sname sname varchar(20) が null ではありません。

フィールドに非NULL制約を追加すると、次の特性を持つようになります。

  1. フィールドに NOT NULL 制約を設定すると、NULL 値を挿入できなくなります。
  2. フィールドに非 null 制約が設定されると、null 値を挿入できなくなるだけでなく、値を挿入することもできなくなります。
「こうした細かい点に気づかないこともあるので、個別に説明します。」
1: フィールドに非 null 制約が設定されると、null 値を挿入できなくなります。
-- 次の挿入はエラーになります。
学生(sname,age)に値(null,22)を挿入します。

2: フィールドに非 null 制約が設定されると、null 値を挿入できなくなるだけでなく、値を挿入することもできなくなります。
-- 次の挿入でもエラーが報告されます。
学生(年齢、IDカード)に値(33、"123456789")を挿入します。

以下にいくつか例を挙げます。

デフォルト値制約を追加する(デフォルト)

フィールドにデフォルト値が設定されている場合、フィールドに値を指定しないと、このデフォルト値が表示されます。

デフォルト値制約の追加

方法 1: テーブルを作成するときに、フィールドにデフォルト値を追加します。 
テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20)、
   年齢 int デフォルト 0,
   idカードvarchar(18)
)文字セット=utf8;

方法 2: テーブルを作成した後、フィールドにデフォルト値を追加します。
テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20)、
   年齢 int、
   idカードvarchar(18)
)文字セット=utf8;
「さまざまな点に特別な注意が必要です」
-- alter を使用してデフォルト値を追加するコードは少し特殊です。
テーブルstudentを変更し、年齢を変更し、デフォルトを0に設定します。

デフォルト値を削除する

テーブル student を変更し、列 age を変更し、デフォルトを削除します。

参照整合性

参照整合性とは何ですか?

参照整合性とは、あるテーブル内のフィールドの値が別のテーブル内のフィールドの値を参照する必要があることを意味します。ここで関係するのは外部キーです: 外部キー。一般的に、このテーブルのこのフィールドは外部キーとして設定されます。参照テーブル内のそのフィールドの値は、そのテーブルの主キーとして設定する必要があります。

理解を深めるために、次の図を参照してください。

特記事項: 学生テーブルの cid は、クラス テーブルの cid を参照します。ここでフィールド名がまったく同じであることがわかります。ただし、実際には、2 つのフィールド名は異なっていてもかまいませんが、2 つのフィールドのデータ型は同じである必要があります。

参照整合性を構成する条件は次のとおりです。

  1. あるテーブル (参照テ​​ーブル) のフィールドは、別のテーブル (参照テ​​ーブル) のフィールドを参照します (フィールド名は異なる場合があります)。
  2. 2 つのテーブル内のフィールド名は異なっていてもかまいませんが、フィールドのデータ型は同じである必要があります。
  3. 参照テーブル内のフィールドは、このテーブル内の外部キーです。参照されるテーブル内のフィールドは、そのテーブルの主キーです。

外部キー制約の追加

覚えておかなければならないことの 1 つは、現在のテーブルに外部キー制約を追加する前に、まず参照先のテーブルを用意しておく必要があるということです。そうしないと、誰を参照することになるのでしょうか。

外部キー制約を追加するには、次の 2 つの方法があります。

方法 1: テーブルを作成するときに、フィールドに外部キー制約を追加します。 
テーブル教室を作成(
    cid int 主キー auto_increment,
    cname varchar(20) が null ではない
)文字セット=utf8;

テーブル学生を作成(
   sid int 主キー auto_increment,
   sname varchar(20) が null ではない、
   年齢ビット(1)
   cid int、
   制約 fk_cid 外部キー(cid) は、classroom(cid) を参照します。
)文字セット=utf8;

方法 2: テーブルを作成した後、フィールドに外部キー制約を追加します。
テーブル教室を作成(
    cid int 主キー、
    cname varchar(20) が null ではない
)文字セット=utf8;

テーブル学生を作成(
    sid int 主キー auto_increment,
    sname varchar(20) が null ではない、
    年齢ビット(1)
    cid 整数
)文字セット=utf8;

テーブル student を変更し、制約 fk_cid 外部キー (cid) を追加します。
参照教室(cid);
「注意: 制約の後にエイリアスが続き、fk_cid はエイリアスと同等です。」

要約する

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

以下もご興味があるかもしれません:
  • MySQL の null 制約のケースの説明
  • MySQL 外部キー制約 (FOREIGN KEY) ケースの説明
  • MySQL 外部キー制約とテーブル関係の概要
  • MySQL 8.0 の新機能 - チェック制約の紹介
  • MySQL での外部キーの作成、制約、削除
  • MySQL のインデックスと制約の例文
  • MySQL 外部キー制約の例の説明
  • MySQL 外部キー制約の詳細な説明
  • MySQL 整合性制約の例の詳細な説明
  • MySQL 制約の超詳細な説明

<<:  Harborを使用してプライベートDockerリポジトリを構築する方法

>>:  さまざまなネットワーク画像形式におけるPNGの利点の詳細な説明

推薦する

JavaScript 関数構文の説明

目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...

VMware Workstation Pro が Windows で実行されない場合の解決策

国慶節の休暇後、Windows アップデート後に VMware 仮想マシンが開けなくなり、「VMwa...

JavaScript ES6 モジュールの詳細な説明

目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...

Vue で video.js を使用して m3u8 形式のビデオを再生する方法

目次1. インストール2. videojsの紹介3. コンポーネントでのテストと使用1. 基本的な自...

IE7 互換モードで IE8 を有効にするコード

最も人気のあるタグはIE8ですブラウザベンダーはバージョンアップデートのリリースに躍起になっている一...

MySQLは文字列関数のSQL文をインターセプトします

1. left(name,4)は左の4文字をインターセプトしますリスト: SELECT LEFT(2...

Vue-cliはプロジェクトを作成し、プロジェクト構造を分析します

目次1. ディレクトリを入力してプロジェクトを作成する2. 必要な設定項目を選択します2.1 Vue...

HTML ul および li タグを使用して画像を表示するサンプル コード

以下のコードをDreamweaverのコードエリアにコピーすると、プレビュー時に以下の画像が表示され...

SQL と MySQL のステートメント実行順序の分析

今日、問題が発生しました: MySQL の insert into、update、delete ステ...

Dockerディスク容量不足の問題を解決する

Docker が配置されているサーバーをしばらく稼働させたところ、サーバーのディスク ディレクトリの...

Nginx Httpモジュールシリーズにおけるautoindexモジュールの具体的な使用法

ブラウザ モジュールの主な機能は、http リクエスト ヘッダーの「User-Agent」の値とブラ...

Datagrip2020 が MySQL ドライバーのダウンロードに失敗する

「downloadlaod」を直接クリックしてもダウンロードできない場合は、ここからダウンロードす...

ユーザーエクスペリエンスの構築

<br />おそらく、あなたは会社に入社したばかりで、その会社が「ユーザビリティ」に関す...

yumコマンドの使い方

1. yumの紹介Yum (フルネームは Yellow dogUpdater、Modified) は...

MYSQLストアドプロシージャコメントの詳細な説明

目次1. 使用方法2. 準備3. 文法3.1 変数と代入3.2 入力および出力パラメータ3.3 プロ...