データベース内の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 仮想マシン (CentOS7 イメージ) を使用して Linux をインストールする

1. VMwareのダウンロードとインストールリンク: https://www.jb51.net/s...

Dockerデーモンのセキュリティ設定項目の詳細な説明

目次1. テスト環境1.1 CentOS 7をインストールする1.2 Docker CE 19.03...

JavaScript の継承についてどれくらい知っていますか?

目次序文コンストラクタ、プロトタイプオブジェクト、インスタンスオブジェクトの関係プロトタイプチェーン...

jQueryブリージングカルーセルの制作原理を詳しく解説

この記事では、jQueryブリージングカルーセル制作原理の具体的なプロセスを参考までに紹介します。具...

ウェブデザイナー職の面接でよくある質問と回答

1. ASP.NET Web アプリケーションのテンプレートとは何ですか? それらの違いは何ですか?...

MySQL 基本チュートリアル パート 1 MySQL5.7.18 のインストールと接続チュートリアル

この記事から、MySQL を紹介し学習するための新しい一連の記事がスタートします。なぜ MySQL ...

Vue がコンポーネント通信を実装する 8 つの例

目次1. Props 親コンポーネント ---> 子コンポーネント通信2. $emit 子コン...

Nginx プロキシ転送構成を通じてクロスドメイン API プロキシ転送を実装する方法

序文WEB 開発では、クロスドメイン リクエストが頻繁に発生します。クロスドメインの問題を解決する方...

.html、.htm、.shtml、.shtm の違いと関連性について簡単に説明します。

ご存知のとおり、私たちが毎日閲覧する Web ページ、Web サイト、または Web ページには独自...

Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要

1. はじめにロケーション命令は、http モジュールのコア構成です。事前に定義された URL マッ...

Vue+SpringBoot で Alipay サンドボックス決済を実装するためのサンプルコード

まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...

React における ref の一般的な使用法の概要

目次Refsとは何か1. 文字列型参照2. コールバック参照React.createRef() 4....

docker CMD/ENTRYPOINT が sh スクリプトを実行する問題の解決策: not found/run.sh:

Dockerfile の設定に問題はありませんが、ENTRYPOINT コマンドを実行するとエラー...

Vueのシンプルストアの詳しい説明

Vue におけるストアの最も単純な応用はグローバル ストレージです。ここでは、相互にジャンプするため...

MySQL マスタースレーブレプリケーションの実装手順

目次mysql マスタースレーブレプリケーションMySQL マスタースレーブレプリケーション方式My...