MySQL 整合性制約の例の詳細な説明

MySQL 整合性制約の例の詳細な説明

この記事では、MySQL の整合性制約について説明します。ご参考までに、詳細は以下の通りです。

メインコンテンツ

  • null ではなくデフォルト
  • 個性的
  • 主要な
  • 自動増分
  • 外部キー

制約: データの整合性と一貫性を確保するために使用される

主に

主キー (PK) #このフィールドをテーブルの主キーとして識別し、レコードを一意に識別します。
FOREIGN KEY (FK) #このフィールドをテーブルへの外部キーとして識別します
NOT NULL # はフィールドが空であってはならないことを示します
UNIQUE KEY (UK) # は、このフィールドの値が一意であることを示します。
AUTO_INCREMENT #このフィールドの値が自動的に増加することを示します(整数型で主キーです)
DEFAULT #このフィールドのデフォルト値を設定する
符号なし #符号なし
ZEROFILL #0で埋める

個性的

MySQLでは、単一列ユニークと呼ばれます

#例1:
テーブル部門を作成(
  id int、
  名前 char(10) ユニーク
);
mysql> 部門に値(1,'it'),(2,'it')を挿入します。
エラー 1062 (23000): キー 'name' のエントリ 'it' が重複しています
#例2:
テーブル部門を作成(
  id int ユニーク、
  名前 char(10) ユニーク
);
部門に値(1,'it'),(2,'sale')を挿入します。
#ユニークなテーブル部門を作成する2番目の方法(
  id int、
  名前 char(10) ,
  ユニーク(ID)、
  ユニーク(名前)
);
部門に値(1,'it'),(2,'sale')を挿入します。

結合一意: レコードの 2 つの列に 1 つの異なる列がある限り、結合一意制約が満たされます。

# サービステーブルを作成するmysql> create table services(
  -> id int、
  -> ip char(15)、
  -> ポート int、
  -> ユニーク(ID)、
  -> ユニーク(IP,ポート)
  -> );
クエリは正常、影響を受けた行は 0 行 (0.05 秒)
mysql> desc サービス;
+-------+----------+------+------+--------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-------+----------+------+------+--------+-------+
| id | int(11) | YES | UNI | NULL | |
| ip | char(15) | はい | MUL | NULL | |
| ポート | int(11) | はい | | NULL | |
+-------+----------+------+------+--------+-------+
セット内の 3 行 (0.01 秒)
#結合一意性、レコードの2つの列に1つの列が異なる限り、結合一意性制約を満たします。mysql> insert into services values
  -> (1,'192,168,11,23',80),
  -> (2,'192,168,11,23',81),
  -> (3,'192,168,11,25',80);
クエリは正常、3 行が影響を受けました (0.01 秒)
記録: 3 重複: 0 警告: 0
mysql> サービスから * を選択します。
+------+---------------+------+
| ID | IP | ポート |
+------+---------------+------+
| 1 | 192,168,11,23 | 80 |
| 2 | 192,168,11,23 | 81 |
| 3 | 192,168,11,25 | 80 |
+------+---------------+------+
セット内の 3 行 (0.00 秒)
mysql> サービス値に挿入します(4、'192、168、11、23'、80);
エラー 1062 (23000): キー 'ip' のエントリ '192,168,11,23-80' が重複しています

自動増分

制約: 制約フィールドは自動的に増加し、制約フィールドはキーによって制約される必要があります。

ID を指定しない場合は自動的に拡張されます。

# 生徒を作成
テーブル学生を作成(
id int 主キー auto_increment,
名前varchar(20),
性別 enum('男性','女性') デフォルト '男性'
);

mysql> desc 学生;
+-------+-----------------------+------+-----+---------+----------------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | 自動増分 |
| 名前 | varchar(20) | はい | | NULL | |
| 性別 | enum('男性','女性') | はい | | 男性 | |
+-------+-----------------------+------+-----+---------+----------------+
セット内の行数 (0.17 秒)
#レコードを挿入mysql> insert into student(name) values ​​('老白'),('小白');
クエリは正常、2 行が影響を受けました (0.01 秒)
記録: 2 重複: 0 警告: 0
mysql> 学生から * を選択します。
+----+--------+------+
| ID | 名前 | 性別 |
+----+--------+------+
| 1 | ラオバイ | 男性 |
| 2 | 小白 | 男性 |
+----+--------+------+
セット内の行数 (0.00 秒)

IDを指定する場合

mysql> 学生の値に挿入(4,'asb','female');
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> 学生の値に挿入します(7,'wsb','female');
クエリは正常、1 行が影響を受けました (0.01 秒)
mysql> 学生から * を選択します。
+----+--------+--------+
| ID | 名前 | 性別 |
+----+--------+--------+
| 1 | ラオバイ | 男性 |
| 2 | 小白 | 男性 |
| 4 | asb | 女性 |
| 7 | wsb | 女性 |
+----+--------+--------+
セット内の行数 (0.00 秒)
# 再度 ID を指定せずにレコードを挿入すると、前回の最後のレコードから増加し続けますmysql> insert into student(name) values ​​('大白');
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> 学生から * を選択します。
+----+--------+--------+
| ID | 名前 | 性別 |
+----+--------+--------+
| 1 | ラオバイ | 男性 |
| 2 | 小白 | 男性 |
| 4 | asb | 女性 |
| 7 | wsb | 女性 |
| 8 | ダバイ | 男性 |
+----+--------+--------+
セット内の行数 (0.00 秒)

自動増分フィールドの場合、delete を使用して削除した後、再度値を挿入すると、フィールドは削除前の位置に応じて増加し続けます。

mysql> 学生から削除;
クエリは正常、5 行が影響を受けました (0.00 秒)
mysql> 学生から * を選択します。
空のセット (0.00 秒)
mysql> 学生から * を選択します。
空のセット (0.00 秒)
mysql> 学生名に値('ysb')を挿入します。
クエリは正常、1 行が影響を受けました (0.01 秒)
mysql> 学生から * を選択します。
+----+------+------+
| ID | 名前 | 性別 |
+----+------+------+
| 9 | ysb | 男性 |
+----+------+------+
セット内の行数 (0.00 秒)
#テーブルをクリアするには truncate を使用する必要があります。レコードを 1 つずつ削除する delete と比較すると、truncate はテーブルを直接クリアします。大きなテーブルを削除するときに使用します。mysql> truncate student;
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
mysql> 学生(名前)に値('xiaobai')を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> 学生から * を選択します。
+----+---------+------+
| ID | 名前 | 性別 |
+----+---------+------+
| 1 | xiaobai | 男性 |
+----+---------+------+
セット内の行数 (0.00 秒)
マイSQL>
auto_increment_increment と auto_increment_offset

auto_incで始まる利用可能な単語を表示

mysql> 'auto_inc%' のような変数を表示します。
+--------------------------+-------+
| 変数名 | 値 |
+--------------------------+-------+
| 自動増分 | 1 |
| 自動増分オフセット | 1 |
+--------------------------+-------+
セット内の行数 (0.02 秒)

# ステップ長 auto_increment_increment、デフォルトは 1
# 開始オフセット auto_increment_offset、デフォルトは 1
# ステップ サイズをセッション設定に設定します。これはこの接続でのみ有効です。set session auto_increment_increment=5;
#グローバルステップサイズ設定は有効です。
グローバル auto_increment_increment=5 を設定します。
# 開始オフセットを設定します。set global auto_increment_offset=3;

強調: auto_increment_offset の値が auto_increment_increment の値より大きい場合、auto_increment_offset の値は無視されます。
翻訳: auto_increment_offsetの値がauto_increment_incrementの値より大きい場合、auto_increment_offsetの値は無視されます。

開始オフセットとステップ サイズを設定した後、show variables like'auto_inc%' を再度実行します。

以前と同じように、動作させるにはまず終了してからログインする必要があることがわかりました。

mysql> 'auto_inc%' のような変数を表示します。
+--------------------------+-------+
| 変数名 | 値 |
+--------------------------+-------+
| 自動増分 | 5 |
| 自動増分オフセット | 3 |
+--------------------------+-------+
セット内の行数 (0.00 秒)
#以前にレコードid=1があったため
mysql> 学生から * を選択します。
+----+---------+------+
| ID | 名前 | 性別 |
+----+---------+------+
| 1 | xiaobai | 男性 |
+----+---------+------+
セット内の行数 (0.00 秒)
# 次に挿入するときは、位置 3 から開始し、毎回レコード ID + 5 を挿入します。
mysql> 学生(名前)に値('ma1'),('ma2'),('ma3')を挿入します。
クエリは正常、3 行が影響を受けました (0.00 秒)
記録: 3 重複: 0 警告: 0
mysql> 学生から * を選択します。
+----+---------+------+
| ID | 名前 | 性別 |
+----+---------+------+
| 1 | xiaobai | 男性 |
| 3 | ma1 | 男性 |
| 8 | ma2 | 男性 |
| 13 | ma3 | 男性 |
+----+---------+------+

テーブルをクリアすると、削除と切り捨ての違いが区別されます。

delete from t1; #自動増分 ID がある場合、新しく追加されたデータは削除前の最後の ID から始まります。

truncate table t1; データ量が多く、削除速度が前回よりも速く、最初から直接開始されます。

外部キー

外部キーを理解する

上図に示すように、会社に多くの従業員がいる場合、各従業員は部門に対応しており、フォームに記入するときにこれらの部門が繰り返し記述されることになり、冗長になりすぎます。

それらを分離することができます

この時点では、2 つのテーブルがあります。1 つは従業員テーブルで、emp テーブル (関連テーブル、スレーブ テーブルとも呼ばれる) と呼ばれます。 1 つは、dep テーブル (関連テーブル、メイン テーブルとも呼ばれる) と呼ばれる部門テーブルです。

#1. テーブルを作成するときは、まず関連テーブルを作成し、次に関連テーブルを作成します。# 最初に関連テーブルを作成します (dep テーブル)
テーブル dep を作成します(
  id int 主キー、
  名前varchar(20)がnullではない、
  varchar(20) を null でないと記述する
);
# 関連テーブル (emp テーブル) を作成する
テーブルempを作成します(
  id int 主キー、
  名前varchar(20)がnullではない、
  年齢 int が null でない、
  dep_id int,
  制約 fk_dep foreign key(dep_id) は dep(id) を参照します //制約を作成します);
#2. レコードを挿入するときは、まず関連テーブルにレコードを挿入し、次に関連テーブルにレコードを挿入します。
(1、「IT」、「ITテクノロジー有限部門」)
(2、「営業部」、「営業部」)、
(3、「財務部」、「お金を使いすぎる部署」)
emp値に挿入
(1,'張山',18,1)、
(2,'リシ',19,1),
(3,'エゴン',20,2),
(4,'元昊',40,3)、
(5,'アレックス',18,2);

3. テーブルを削除する

#論理的に言えば、部門テーブル内の部門が削除されると、従業員テーブル内の関連レコードも次々と削除されます。
mysql> id=3 の dep から削除します。
エラー 1451 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました (`db5`.`emp`、制約 `fk_name` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))
#ただし、従業員テーブルのレコードを削除した後、現在の部門を削除しても問題はありません。mysql> delete from emp where dep_id =3;
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> emp から * を選択します。
+----+----------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+----------+-----+--------+
| 1 | 張さん | 18 | 1 |
| 2 | リシ | 18 | 1 |
| 3 | エゴン | 20 | 2 |
| 5 | アレックス | 18 | 2 |
+----+----------+-----+--------+
セット内の 4 行 (0.00 秒)
mysql> id=3 の dep から削除します。
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> dep から * を選択します。
+----+-----------+----------------------+
| ID | 名前 | 説明 |
+----+-----------+----------------------+
| 1 | IT | ITテクノロジーリミテッド |
| 2 | 営業部 | 営業部 |
+----+-----------+----------------------+
セット内の 2 行 (0.00 秒)

上記のテーブルレコードを削除する操作はかなり複雑です。論理的に言えば、ある部門が解雇された場合、その部門の従業員も解雇されることになります。実は、テーブルを作成するときに、同期削除と同期更新と呼ばれる非常に重要なコンテンツがもう1つあります。

削除カスケード #同期削除
更新カスケード #同期更新

テーブルempを作成します(
  id int 主キー、
  名前varchar(20)がnullではない、
  年齢 int が null でない、
  dep_id int,
  制約 fk_dep 外部キー(dep_id) は dep(id) を参照します 
  on delete cascade #同期削除 on update cascade #同期更新);

# 関連テーブル (dep) のレコードを削除し、関連テーブル (emp) のレコードも削除します。mysql> delete from dep where id=3;
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> dep から * を選択します。
+----+-----------+----------------------+
| ID | 名前 | 説明 |
+----+-----------+----------------------+
| 1 | IT | ITテクノロジーリミテッド |
| 2 | 営業部 | 営業部 |
+----+-----------+----------------------+
セット内の 2 行 (0.00 秒)
mysql> emp から * を選択します。
+----+----------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+----------+-----+--------+
| 1 | 張さん | 18 | 1 |
| 2 | リシ | 19 | 1 |
| 3 | エゴン | 20 | 2 |
| 5 | アレックス | 18 | 2 |
+----+----------+-----+--------+
セット内の 4 行 (0.00 秒)
# 関連テーブル (dep) のレコードと、関連テーブル (emp) のレコードも変更します。mysql> update dep set id=222 where id=2;
クエリは正常、1 行が影響を受けました (0.02 秒)
一致した行: 1 変更された行: 1 警告: 0
# 両方のテーブルが削除され、変更されたかどうかをすぐに確認します。mysql> select * from dep;
+-----+-----------+----------------------+
| ID | 名前 | 説明 |
+-----+-----------+----------------------+
| 1 | IT | ITテクノロジーリミテッド |
| 222 | 営業部 | 営業部 |
+-----+-----------+----------------------+
セット内の 2 行 (0.00 秒)
mysql> emp から * を選択します。
+----+----------+-----+--------+
| ID | 名前 | 年齢 | dep_id |
+----+----------+-----+--------+
| 1 | 張さん | 18 | 1 |
| 2 | リシ | 19 | 1 |
| 3 | エゴン | 20 | 222 |
| 5 | アレックス | 18 | 222 |
+----+----------+-----+--------+
セット内の 4 行 (0.00 秒)

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL 制約の超詳細な説明
  • MySQL の 6 つの一般的な制約タイプの詳細な説明
  • MySQL 制約の種類と例
  • MySQL データベースに基づくデータ制約の例と 5 つの整合性制約の紹介
  • MySQL 学習: データベース テーブルの 5 つの主要な制約を初心者向けに詳しく説明します

<<:  echartsマップカルーセルハイライトを解決するための記事

>>:  LinuxでTomcatのポート番号を変更する方法

推薦する

Dockerコンテナデータをコピーしてバックアップする方法の詳細な説明

ここでは、Jenkins コンテナを例に 3 つの方法を紹介します。方法1コンテナをイメージにパッケ...

MySQL の複合インデックスはどのように機能しますか?

目次背景複合インデックスを理解する左端一致原則フィールド順序の影響複合インデックスは単一のインデック...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...

Win Server 2019 サーバーの IIS 構成と Web サイトの簡単な公開

1.まずサーバーにリモート接続する2. サーバーマネージャーを開く 3役割と機能の追加 4サーバープ...

Vue は水の波紋効果のクリックフィードバック指示を実装します

目次水波効果実装を見てみましょう水の波紋のデフォルトスタイルをカスタマイズする水の波紋の位置と直径を...

CocosCreatorでJSZip圧縮を使用する方法

CocosCreator バージョン: 2.4.2 jszipの実践的なプロジェクトアプリケーション...

リンクAの意味論、書き方、ベストプラクティス

リンク A のセマンティクス、ライティング スタイル、およびベスト プラクティス。私は JavaEy...

Linux コマンドラインでパケットをキャプチャするために tcpdump を使用するいくつかの機能

tcpdump は、ネットワークの問題のトラブルシューティングに効果的に役立つ、柔軟で強力なパケット...

HTMLテキストオーバーフローの2つの一般的な解決策は省略記号を表示することです

方法1: CSSオーバーフロー省略を使用して解決する解決策は次のとおりです。 CSSコード: ディス...

JavaScript 基礎シリーズ: 関数とメソッド

目次1. 関数とメソッドの違い2. 良い関数の書き方2.1 正確な命名2.1.1 関数の命名2.1....

MySQL 5.7.15 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...

Ubuntu 18.04 で apt ソースを Alibaba Cloud ソースに変更する詳細なプロセス

目次序文: Ubuntu 18.04 は apt ソースを Alibaba Cloud ソースに変更...

OR キーワードを使用した MySql 複数条件クエリ ステートメント

前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...

Vueでスケルトンスクリーンを実装する例

目次スケルトンスクリーンの使用Vueアーキテクチャスケルトンスクリーンアイデアの概要抽象コンポーネン...

サイバーパンクスタイルのボタンを実現するためのHTML+CSS

まず効果を見てみましょう: 序文:このアイデアは、Bilibili のアップロード者 Steven ...