この記事では、MySQL の整合性制約について説明します。ご参考までに、詳細は以下の通りです。 メインコンテンツ
制約: データの整合性と一貫性を確保するために使用される 主に
個性的 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 の値は無視されます。 開始オフセットとステップ サイズを設定した後、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データベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: echartsマップカルーセルハイライトを解決するための記事
1. 「stripslashes($_POST['json']);」メソッドを使用し...
1. 追加時間()指定した秒数を日付に追加する select addtime(now(),1); -...
次のように: -m, --memory メモリ制限。形式は数値と単位です。単位は b、k、m、g の...
今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...
目次1. はじめに1.1 Babel トランスコーダ1.2 ポリフィル2. let と const ...
1. ファイルの権限と所有権の概要1. アクセス権Read r: ファイルの内容を表示し、ディレクト...
1. まず、gitを関連付けるときにエラーメッセージが報告されます: エラー: ビルドするリビジョン...
質問最近、SSH フレームワークを使用して実用的なプロジェクトを完了していたときに、長い間悩まされて...
1. コマンドの紹介tac (cat の逆順) コマンドは、ファイルの内容を行単位で逆順に出力します...
目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...
最近、MySQL を使用してテーブル データを Excel ファイルにエクスポートしました。MySQ...
この記事では主に、クーポンの背景画像などでよく使われる CSS 円形ホローイングについて紹介し、皆さ...
目次1. ツールの紹介2. ワークフロー3. 操作インターフェースとパラメータ設定(1)監視と再起動...
目次序文SessionStorage と LocalStorage の紹介SessionStorag...
この記事では、Docker を使用して Centos6 に Kafka プロジェクトをデプロイする方...