データベース内の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で連打技術を実現

推薦する

HTMLのリストタグを数える

1. <dl>はリストを定義し、<dt>はリスト内の項目を定義し、<d...

MySql8.0以降のバージョンでROOTパスワードを正しく変更する方法

展開環境:インストールバージョン Red Hat Cent 7.0 MYSQL バージョン 8.0....

HTMLベースの複数画像アップロードのプレビュー機能を実装

最近、Web ページに複数の画像をアップロードするためのスクリプトを作成しました。これは非常に実用的...

Webリクエストと処理のTomcatソースコード分析

目次序文1. エンドポイント2. 接続ハンドラ3. コヨーテ4. コンテナ責任チェーンパターン序文T...

Dockerでイメージをプルするための手順を完了する

1. Docker pullはイメージをプルします$ docker pull {IMAGE_NAME...

Nodeはリクエスト追跡にasync_hooksモジュールを使用します

async_hooks モジュールは、Node.js バージョン 8.0.0 に正式に追加された実験...

Windows 2008 Server サブドメインを親ドメインに追加すると、ドメインが既に存在するというエラー メッセージが表示されます。

Windows 2008 Serverのサブドメインを親ドメインに参加させると、「ドメインは既に存...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

ウェブテーブルフレームを作成するためのヒント

<br />Web テーブル フレームを作成するためのヒント。 ------------...

Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ

目次環境説明DockerのインストールゴグのインストールDocker で .NetCore サービス...

VMWare ネットワーク アダプタの 3 つのモードの実装プロセスの分析

3つのモードブリッジ(ブリッジ モード)、NAT(ネットワーク アドレス変換モード)、ホストオンリー...

Docker Compose のインストールと使用手順

目次1. Docker Compose とは何ですか? 2. Docker Composeのインスト...

ウェブデザインにおける円形要素の使用例 25 選

本日の投稿では、Web デザインで使用される円形要素の優れた例をいくつか挙げ、美しい丸いボタン、メニ...

Tomcat のパフォーマンス最適化方法の簡単な概要

Tomcat自体の最適化Tomcat メモリ最適化起動時に大きなメモリ ブロックが必要であることを ...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...