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

推薦する

Linux 上の MYSQL 5.7 でルート パスワードを取得する際の問題 (テスト済み、利用可能)

目次1. --skip-grant-tables 経由で取得する1.1 my.conf を変更し、新...

Dockerを使用してGitlabを素早くデプロイする方法

1. GitLabイメージをダウンロードする docker pull gitlab/gitlab-c...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

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

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

react+antdプロジェクトをゼロから構築する方法を教えます

これまでの記事はすべて私自身の学習記録であり、主に以前に遭遇した落とし穴を忘れないようにするためのも...

JavaScriptオフセットは、ウィンドウ内でのマウス座標の取得とモジュールのドラッグを実装します。

オフセットOffset はオフセットです。関連プロパティの offset シリーズを使用すると、次の...

IE6 での PNG アルファ透明度 (完全コレクション)

IE6 は PNG の透明度をサポートしていないと多くの人が言っています。実際、IE は 100%...

初心者のためのウェブサイト構築入門 - ウェブサイト構築に必要な条件とツール

今日は、初心者の次のような質問に答えます。学ぶ勇気さえあれば、自分のウェブサイトを構築するのは簡単で...

MySQLデータベース移行により、大量のデータを迅速にエクスポートおよびインポートできます

データベースの移行は、よく遭遇する問題です。データ量が少ない場合、移行は基本的に問題になりません。実...

JavaScript を使用してページ要素のオフセットを取得/計算する方法

質問コントロールをクリックすると、コントロールの下にフローティング レイヤーが表示されます。通常の方...

Vue はコンポーネント間の通信をどのように実装しますか?

目次1. 父と息子のコミュニケーション1.1 親コンポーネント --> 子コンポーネント1.2...

vue-cli を使用してプロジェクトを作成し、webpack でパッケージ化する方法

1. 環境を準備する(Node.jsをダウンロードし、環境変数を設定する) 2. vue-cliをグ...

JavaScript ES 新機能ブロックスコープ

目次1. ブロックスコープとは何ですか? 2. ブロックスコープが必要なのはなぜですか? 3. 関数...

データベースアカウントのパスワード暗号化の詳細な説明と例

データベースアカウントのパスワード暗号化の詳細な説明と例データベースアカウントとパスワードはデータベ...

RGBAアルファ透明度変換計算表

IEでのRGBAとフィルター値の変換RGBA 透明度値IE フィルター値0.1 19 0.2 33 ...