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

推薦する

MySQLトリガーの例の詳細な説明

目次トリガーとは何かトリガーを作成する複数の実行ステートメントを持つトリガーの作成制限と考慮事項要約...

MySQL 起動エラー InnoDB: ロックできません/ibdata1 エラー

OS X 環境で MySQL を起動すると、エラー メッセージが表示されます。 016-03-03T...

ウェブのさまざまなフロントエンド印刷方法: CSS はウェブページの印刷スタイルを制御します

CSS は Web ページの印刷スタイルを制御します。 CSS を使用して印刷スタイルを制御します。...

MySQL 数十億のデータのインポート、エクスポート、移行に関するメモ

最近はMySQLのメモをたくさん取っていますが、それは主に会社のOracleが比較的安定していてメン...

MySQLは文字列の連結、インターセプション、置換、位置検索操作を実装しています

MySQL 文字列の連結、インターセプト、置換、および検索位置。よく使用される文字列関数:関数例示す...

HTML テーブルに複雑なテーブル ヘッダーを実装するためのサンプル コード

複雑な表を作成するには HTML を使用します。複雑なテーブルでは通常、td の rowspan 属...

IE8はマルチ互換モードを使用してWebページを正常に表示します

IE8には複数の互換モードがあります。 IE プラットフォームの設計者である Chris Wilso...

Linux Cron によるパラメータ付き PHP コードのスケジュール実行

1. 引き続き PHP スクリプトを使用して実行します。コマンドラインに入力: php /home/...

MLSQL スタックでストリームのデバッグを簡単にする方法

序文クラスメートが MLSQL Stack のストリーミング サポートを調査しています。そこで、フロ...

10分でDockerを使ったマイクロサービスのデプロイ方法を学ぶ

Docker は 2013 年のリリース以来、広く注目され、ソフトウェア業界を変える可能性を秘めてい...

Linux のパスワードを紛失した場合にリセットする方法

1. スタートアップメニューでは、カーソルを最初の行に移動します - eを押します 2. UTF-8...

Node.js のイベント モジュールに関する知識ポイントのまとめ

Node の研究と応用を通じて、NodeJS はシングルスレッド、イベント駆動型、非ブロッキング I...

Apache、Tomcat、Nginx サーバーの詳細な理解と比較分析

質問1件会社のサーバーはApacheを使用しており、バックエンドはPHP、サーバーはLinux C/...

Linux ファイルディレクトリ管理コマンドの概要

タッチコマンドこれには 2 つの機能があります。1 つは、既存のファイルの時間タグを現在のシステム時...

Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。

概要Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker...