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のポート番号を変更する方法

推薦する

PHP で JSON バックスラッシュを削除する例

1. 「stripslashes($_POST['json']);」メソッドを使用し...

MySQLの日付加算と減算関数の詳細な説明

1. 追加時間()指定した秒数を日付に追加する select addtime(now(),1); -...

Dockerは指定されたメモリで操作を実行します

次のように: -m, --memory メモリ制限。形式は数値と単位です。単位は b、k、m、g の...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...

フロントエンドJavaScript ES6の詳細について

目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...

Linux ファイル/ディレクトリの権限と所有権の管理

1. ファイルの権限と所有権の概要1. アクセス権Read r: ファイルの内容を表示し、ディレクト...

dockerでデプロイされたjenkinsでgitプログラムを実行する際の問題について

1. まず、gitを関連付けるときにエラーメッセージが報告されます: エラー: ビルドするリビジョン...

MySQLクエリで大文字と小文字を区別しない問題を解決する方法

質問最近、SSH フレームワークを使用して実用的なプロジェクトを完了していたときに、長い間悩まされて...

Linux tac コマンドの実装例

1. コマンドの紹介tac (cat の逆順) コマンドは、ファイルの内容を行単位で逆順に出力します...

MySQL 分離列とプレフィックスインデックスの使用の概要

目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...

MySQL から Excel にテーブルデータをエクスポートする際の日時形式に関する簡単な説明

最近、MySQL を使用してテーブル データを Excel ファイルにエクスポートしました。MySQ...

CSS 円形ホローイングの実装(クーポン背景画像)

この記事では主に、クーポンの背景画像などでよく使われる CSS 円形ホローイングについて紹介し、皆さ...

IISMonitor を使用して Web ページを監視し、IIS を自動的に再起動します。

目次1. ツールの紹介2. ワークフロー3. 操作インターフェースとパラメータ設定(1)監視と再起動...

Javascript で SessionStorage と LocalStorage を使用する方法

目次序文SessionStorage と LocalStorage の紹介SessionStorag...

docker を使用して kafka プロジェクトをデプロイする Centos6 方法の分析

この記事では、Docker を使用して Centos6 に Kafka プロジェクトをデプロイする方...