データベース内のSQL整合性制約ステートメントの分析

データベース内のSQL整合性制約ステートメントの分析

整合性制約

整合性制約はテーブル データの正確性を保つためのものです。データが正しくない場合は、そもそもテーブルに追加できません。

1 主キー

列に主キー制約を追加すると、この列のデータは繰り返すことができなくなります。このように、各レコード行の主キー列の値は、その行の一意の識別子になります。たとえば、学生の ID 番号は一意の識別子として使用できますが、学生の名前は複数の学生が同じ名前を持つ可能性があるため、一意の識別子として使用できません。
主キー列の値は NULL または重複にできません。

主キー制約を指定するには、PRIMARY KEY キーワードを使用します。

テーブルを作成します。列を定義するときに主キーを指定します。

テーブルの作成(
         sid CHAR(6) 主キー、
         sname VARCHAR(20)、
         年齢 INT、
         性別 VARCHAR(10)
);

テーブルを作成します。列を定義してから、主キーを個別に指定します。

テーブルの作成(
         sid CHAR(6)、
         sname VARCHAR(20)、
         年齢 INT、
         性別 VARCHAR(10)、
         主キー(sid)
);

テーブルを変更するときに主キーを指定します。

ALTER TABLE スタ
主キーを追加します(sid);

主キーを削除するには (主キー列ではなく、主キー制約のみを削除します)、次の手順を実行します。

ALTER TABLE stu DROP PRIMARY KEY;

2. 主キーの自動増分

MySQL は主キーの自動増加機能を提供します。主キーを自動増分に設定すると、主キー値が指定されていない場合、主キー値が自動的に生成され、最大の主キー値 + 1 になるため、主キーが重複する可能性がなくなります。

テーブルを作成するときに主キーを自動拡張するように設定します (自動拡張するには主キーが整数である必要があります)。

テーブルの作成(
         sid INT 主キー AUTO_INCREMENT、
         sname VARCHAR(20)、
         年齢 INT、
         性別 VARCHAR(10)
);

テーブルを変更するときに主キーの自動増分を設定します。

ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;

テーブルを変更するときに主キーの自動増分を削除します。

ALTER TABLE stu を変更し、sid sid INT を変更します。

3 空ではない

空でない制約を指定する列には、値がないことはできません。つまり、レコードを挿入するときには、空でない制約が追加された列に値を指定する必要があります。レコードを変更するときは、空でない列の値を NULL に設定することはできません。

非 null 制約を指定します。

テーブルの作成(
         sid INT 主キー AUTO_INCREMENT、
         sname VARCHAR(10) NOT NULL、
         年齢 INT、
         性別 VARCHAR(10)
);

sname フィールドを空でない値として指定した後、レコードを stu テーブルに挿入するときに sname フィールドの値を指定する必要があります。そうしないと、エラーが報告されます。

stu(sid) VALUES(1)に挿入します。

挿入されたレコードには sname に指定された値がないため、エラーが報告されます。

4 ユニーク

フィールドに一意の制約を指定することもできます。列に一意制約が指定されている場合、列内の値は一意である必要があります。これは主キーに似ています。たとえば、stu テーブルの sname フィールドに一意制約を指定するには、次のようにします。

テーブル tab_ab を作成します (
     sid INT 主キー AUTO_INCREMENT、
     sname VARCHAR(10) 一意
);
 
  sname(sid, sname) に VALUES(1001, 'zs') を挿入します。
sname(sid, sname) に VALUES(1002, 'zs') を挿入します。

同じ名前を 2 回挿入すると、MySQL がエラーを出します。

5 外部キー

主キーと外部キーはテーブルを関連付ける唯一の方法です。

外部キーは別のテーブルの主キーです。たとえば、従業員テーブルと部門テーブルの間には関連関係があり、従業員テーブルの部門番号フィールドは外部キーであり、部門テーブルに対する外部キーです。

たとえば、t_section テーブルでは、sid 1 のレコードは、java というカテゴリがあることを示しており、モデレーターは t_user テーブルで uid 1 を持つユーザー、つまり zs です。

たとえば、t_topic テーブルでは、tid 2 のレコードは「Java is coffee」という名前の投稿で、これは Java セクションの投稿であり、その作成者は ww です。

外部キーは、この列の値を別のテーブルの主キー値に制限するために使用されます。 ! !

t_user テーブルを作成し、主キー列として uid を指定します。

テーブルt_userを作成します(
     uid INT 主キー AUTO_INCREMENT、
     uname VARCHAR(20) 一意 NOT NULL
);

t_section テーブルを作成し、 sid を主キー列として指定し、 u_id を t_user テーブルの uid 列の外部キーとして指定します。

テーブルt_sectionを作成します(
         sid INT 主キー AUTO_INCREMENT、
         sname VARCHAR(30)、
         u_id INT、
         制約 fk_t_user 外部キー(u_id) 参照 t_user(uid)
);

t_section テーブルを変更し、t_user テーブルの uid 列への外部キーとして u_id を指定します。

ALTER TABLE t_section
制約 fk_t_user を追加する
外部キー(u_id)
参照 t_user(uid);

t_section テーブルを変更し、u_id の外部キー制約を削除します。

ALTER TABLE t_section
外部キー f​​k_t_user を削除します。

6 テーブル間の関係

  • 1対1: たとえば、t_person テーブルと t_card テーブル、つまり人物と ID カード。この場合、マスターとスレーブの関係、つまり、どのテーブルがマスター テーブルで、どのテーブルがスレーブ テーブルであるかを調べる必要があります。個人は ID カードを持っていない可能性がありますが、その個人の下に ID カードが存在する必要があるため、個人はプライマリ テーブル、ID カードはセカンダリ テーブルになります。スレーブ テーブルを設計するには、次の 2 つのオプションがあります。
  • t_card テーブルに外部キー列を追加し (t_user テーブルを基準として)、外部キーに一意の制約を追加します。
  • t_card テーブルの主キーに外部キー制約を追加します (t_user テーブルを基準として)。つまり、t_card テーブルの主キーは外部キーでもあります。
  • 1対多(多対1):最も一般的なのは1対多です。 1対多と多対1、どちらの観点からこれを見ることができるでしょうか? t_user と t_section の関係は、t_user の観点からは 1 対多ですが、t_section の観点からは多対 1 です。この場合、複数のパーティに外部キーが作成されます。
  • 多対多: たとえば、t_stu テーブルと t_teacher テーブルでは、1 人の生徒に複数の教師が割り当てられ、1 人の教師に複数の生徒が割り当てられます。このような状況では通常、多対多の関係を処理するために中間テーブルを作成する必要があります。たとえば、別のテーブル t_stu_tea を作成し、それに t_stu テーブルに対する相対的な外部キーと t_teacher テーブルに対する相対的な外部キーの 2 つを設定します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 知っておくべきSQL文(VIII)データベース整合性制約
  • SQL ステートメントを使用して制約を作成および削除するためのサンプル コード
  • TPフレームワークとSQL文を使用して、データテーブル内のフィールドに特定の値が含まれているかどうかを照会します。
  • Laravelは最後に実行されたSQL文をクエリする方法を実装しています
  • LaravelはネイティブSQL文とメソッド呼び出しを使用します
  • SQL ステートメントを使用してコンピューターからデータベースに写真をインポートする方法
  • MyBatisPlusカスタムSQL文の実装

<<:  Linux ソフトウェアのインストール場所を確認する簡単な方法

>>:  jsで七夕告白連打の効果を実現、jQueryで連打技術を実現

推薦する

VMware での Ubuntu 16.04 イメージの完全インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04イメージのインストールチュートリアルを参...

VMware Workstation 14 Pro(仮想マシン)にシステムをインストールする方法の詳細な説明

この記事では、VMware Workstation 14 Pro (仮想マシン) にシステムをインス...

Dockerコンテナを停止および削除できない問題の解決策

実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...

JavaScript データ型変換の例 (他の型を文字列、数値型、ブール型に変換する)

序文データ型変換とは何ですか?フォームまたはプロンプトを使用して取得されるデフォルトのデータ型は文字...

docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法

目次1. 概要1. スカイウォーキング入門2. スカイウォーキング建築3. スカイウォーキングはどの...

JavaScript オブジェクト指向の実践の詳細説明: カプセル化とオブジェクトのドラッグ

目次概要1. DOM要素をアニメーション化する方法2. 現在のブラウザでサポートされている変換互換の...

Django は Pillow を使用して検証コード機能を簡単に設定します (Python)

1. モジュールをインポートし、検証状態を定義する PIL から Image、ImageDraw、...

Linux ブートシステム方式の分析

この記事では、Linux システムを起動する方法について説明します。ご参考までに、詳細は以下の通りで...

Vueはデータを初期状態にリセットします

場合によっては、データ内のデータを再利用する必要がありますが、データ内のデータはさまざまなフォーム、...

JavaScript のマクロタスクとマイクロタスクの詳細

目次1. マイクロタスクとは何ですか? 2. マクロタスクとは何ですか? 3. 事例3.1 結論4....

CSS 極座標のサンプルコード

序文このプロジェクトには、衛星測位用のグラフィックスを含むチャートの要件があり、北半球または南半球の...

Alibaba Cloud Server Ubuntu 上の Workbench が MySQL に接続できない問題の解決策 (テスト済み)

過去 2 日間、ワークベンチが Alibaba Cloud Server に接続できない問題を解決す...

docker を使用してシンプルな C/C++ プログラムをデプロイする方法

1. まずhello-world.cppファイルを作成しますプログラムコードは次のとおりです。 #i...

Windows 7 64 ビットに最新バージョンの MySQL サーバーをインストールする方法のグラフィック チュートリアル

最近、MySQL データベースを勉強していて、設定ファイルを頻繁に変更したため、MySQL データベ...

vueプロジェクトは特定の領域に透かしを描くことを実現する

この記事では、Vueを使用して特定の領域に透かしを描く方法を紹介します。具体的な内容は次のとおりです...