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の利点の詳細な説明

推薦する

JDBC および MySQL 一時テーブルスペースの詳細な分析

背景一時テーブルスペースは、データベースのソート操作を管理し、一時テーブルや中間ソート結果などの一時...

MySQLがファントムリードを解決する方法の詳細な説明

1. ファントムリーディングとは何ですか?トランザクションにおいて、複数のクエリの後に結果セットの数...

Layuiはログインインターフェース検証コードを実装します

この記事の例では、ログインインターフェース検証コードを実装するためのlayuiの具体的なコードを参考...

CentOS7.x のアンインストールとインストール MySQL5.7 の操作手順とエンコード形式の変更方法

1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...

CentOS 上での MySQL 5.6 のコンパイルとインストール、および複数の MySQL インスタンスのインストールの詳細な説明

--1. mysql用の新しいグループとユーザーを作成する # ユーザー追加 -M -s /sbin...

HTML テーブルタグチュートリアル (3): 幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、テーブルの幅と高さはコンテンツに応じて自動的に調整されます。テーブルの幅と高さを手動...

Vue カプセル化コンポーネント ツール $attrs、$listeners の使用

目次序文$属性例: $listeners (公式説明)使用シナリオ要約する序文複数レベルのコンポーネ...

Angularコンポーネントの仲介モードの詳細な説明

目次1. 仲介業者モデル2. 例1. 見積コンポーネントに購入ボタンを追加する2. 親コンポーネント...

IE6、IE7、IE8 で CSS3 の丸い角と影のスタイルをサポートする

CSS3 の角丸や影の効果を使ったページを作りたいのですが、IE ブラウザでは対応していません。こ...

シンプルなページカウントダウンを実現するJavaScript

この記事では、参考までに、シンプルなページカウントダウンを実装するためのJavaScriptの具体的...

Linux でユーザーをグループに追加する 4 つの方法の概要

序文Linux グループは、Linux でユーザー アカウントを管理するために使用される組織単位です...

MySQL データベース開発仕様 [推奨]

最近、問題のある新しい SQL が本番データベースに入力される数を最小限に抑えるために、開発仕様を整...

HTML テーブルのオーバーフローの解決方法

テーブルが広い場合は、あふれてしまう可能性があります。たとえば、左と右の 2 つの div がありま...

MySQLのint主キーの自己増分の問題を解決する

導入MySQL データベースを使用する場合、int を主キーとして使用し、自動インクリメントに設定す...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...