MySQL の 6 つの一般的な制約タイプの詳細な分析
制約の文字通りの意味は、何かを行う方法を規定または制限することです。MySQL では、制約はデータ テーブル内のデータのルールを指定することです。データの信頼性を確保するためです。たとえば、特定の列に Null 値を含めることはできません。実際には、次のような制約が発生します。
-
NOT NULL
: 列に NULL 値を含めることができないことを確認します。 -
CHECK
: 列の値が特定の条件を満たしていることを確認します。 -
UNIQUE
: 列内のすべての値が異なることを確認します。 -
PRIMARY KEY
:NOT NULL
およびUNIQUE
の組み合わせ。テーブル内の各行を一意に識別します。 -
FOREIGN KEY
: 外部キー制約 -
DEFAULT
: 値がない場合が指定されている場合、デフォルトは列 Value
[関連する推奨事項: mysql ビデオ チュートリアル ]
Constraint
に設定されます。##1.NULL
MySQL では、列に Null 値が表示されないようにNOT NULL を使用します。テーブルを作成するときの形式は
mysql> create table user(name varchar(255)not null); Query OK, 0 rows affected (0.06 sec)
mysql> insert user values(null); ERROR 1048 (23000): Column 'name' cannot be null
NOT NULL 制約を追加します。
mysql> alter table user modify name varchar(255) not null; Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
NOT NULL制約。
mysql> alter table user modify name varchar(255) null; Query OK, 0 rows affected (0.09 sec) Records: 0 Duplicates: 0 Warnings: 0
2.CHECK
列に条件付き制約を定義する場合は、次のような CHECK を使用して、年齢フィールドを強制的に設定できます。 18 より大きく 80 未満である場合、エラーが報告されます。mysql> create table user(age int(11) check(age>18 and age <80)); Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> insert user values(9); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(19); Query OK, 1 row affected (0.01 sec) mysql> insert user values(81); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql>
mysql> create table user(age int(11),city varchar(255) ,check(age>18 and city='中国')); Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> insert user values(81,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(8,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(20,'2'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(20,'中国'); Query OK, 1 row affected (0.01 sec) mysql> insert user values(20,'中国1'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values(85,'中国'); Query OK, 1 row affected (0.01 sec) mysql> insert user values(9,'中国'); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
mysql> create table user(sex varchar(255) check (sex in ('男','女','未知','人妖'))); Query OK, 0 rows affected (0.05 sec)
mysql> insert user values("男"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("男男"); ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated. mysql> insert user values("女"); Query OK, 1 row affected (0.01 sec) mysql> insert user values("人妖"); Query OK, 1 row affected (0.00 sec)
mysql> create table user (age int(11) ,constraint CHK_AGE check(age>18)); Query OK, 0 rows affected, 1 warning (0.05 sec) mysql> insert user values(5); ERROR 3819 (HY000): Check constraint 'CHK_AGE' is violated. mysql> alter table user drop check CHK_AGE; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> insert user values(5); Query OK, 1 row affected (0.01 sec)
CREATE TABLE `user` (`age` int(11) CHECK (((case when (`age` >=18) then 1 else (case when age<10 and age >0 then 1 else 2 end) end) =1)));
3.UNIQUE
UNIQUE 制約は、列
UNIQUE に重複する値がないことを保証します。および
PRIMARY KEY 制約は列値の一意性を保証しますが、
UNIQUE は各テーブルに複数回出現できますが、
PRIMARY KEY は 1 回しか出現できません。
mysql> create table user (name varchar(255),unique(name)); Query OK, 0 rows affected (0.07 sec)
mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("张三"); ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name'mysql>
mysql> create table user (name varchar(255),constraint name_un unique(name)); Query OK, 0 rows affected (0.07 sec) mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec) mysql> insert user values("张三"); ERROR 1062 (23000): Duplicate entry '张三' for key 'user.name_un' mysql> alter table user drop index name_un; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> insert user values("张三"); Query OK, 1 row affected (0.02 sec)
mysql> show create table user; +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `name` varchar(255) DEFAULT NULL, UNIQUE KEY `name_un` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
UNIQUE 制約を削除するには、
DROP INDEX または
ALTER TABLE ステートメントを使用できます。既存のテーブルのアドオン。
mysql> DROP INDEX name_un ON user; Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table user; +-------+-----------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+-----------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
4.PRIMARY KEY
通常、各テーブルには各行を一意に識別する値が含まれており、この列は PRIMARY KEY と呼ばれます。 mysql> alter table user add constraint name_un unique(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
ログイン後にコピー
mysql> alter table user add constraint name_un unique(name); Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0
5.FOREIGN KEY
##FOREIGN KEY は、テーブル内のフィールドが別のテーブル値のフィールドに存在する必要があることを制約するために使用されます。ただし、別のテーブルでは、この列は必ずしも主キーである必要はなく、一意のインデックスである必要があります。そうでない場合、作成は失敗します。
たとえば、orders テーブルの userId は、user テーブルの id を参照する必要があります。挿入された userId が user テーブルに存在しない場合、挿入することはできません。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>mysql> create table user (id int(11) ,age int(11),primary key (id));
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> insert user values(1,2);
Query OK, 1 row affected (0.02 sec)
mysql> insert user values(1,2);
ERROR 1062 (23000): Duplicate entry &#39;1&#39; for key &#39;user.PRIMARY&#39;mysql></pre><div class="contentsignin">ログイン後にコピー</div></div>
しかし、問題があります。メイン テーブル (ユーザー) のレコードが削除または更新された場合、注文内のレコードはどうなるのでしょうか? , 以下の例のように、エラーが直接報告されていることがわかります。
mysql> create table orders (id int(11) primary key ,userId int(11) , FOREIGN KEY (userId) REFERENCES user(id) ); Query OK, 0 rows affected, 2 warnings (0.06 sec) mysql> insert orders values(1,3); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)) mysql> insert orders values(1,1); Query OK, 1 row affected (0.01 sec)
MySQL には、この種の問題を解決するためにいくつかの制約が用意されています。たとえば、ユーザー テーブルが更新されると、注文も次々に更新されます。
RESTRICT: 子テーブルにレコードがある場合、親テーブルのレコードの更新または削除を拒否します。
CASCADE: 親テーブルのレコードを更新または削除するときに、子テーブルのレコードも自動的に更新または削除します。
SET NULL: 親テーブルのレコードを更新または削除する場合、子テーブルのフィールドの値を null に設定します。
デフォルトではRESTRICTが使用されていることが分かりますので、更新時はRESTRICTも更新され、削除時はnullが設定されるように修正しましょう。
mysql> update user set id =2 where id =1; Cannot delete or update a parent row: a foreign key constraint fails (`t`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `user` (`id`)
ログイン後にコピーテストの更新
mysql> alter table orders add constraint orders_ibfk_1 FOREIGN KEY (`userId`) REFERENCES `user` (`id`) on update cascade on delete set null; Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0
テストの削除。
mysql> select * from user; +----+--------+ | id | name | +----+--------+ | 1 | 张三 | +----+--------+ 1 row in set (0.00 sec) mysql> select * from orders; Empty set (0.00 sec) mysql> insert orders values (1,1); Query OK, 1 row affected (0.01 sec) mysql> update user set id =2 where id =1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from orders; +----+--------+ | id | userId | +----+--------+ | 1 | 2 | +----+--------+ 1 row in set (0.01 sec)
DEFAULT 制約は、列のデフォルト値を設定するために使用されます。値がフィールドに割り当てられていない場合を指定すると、システムによってこのフィールドにデフォルト値が自動的に挿入されます。割り当てがない場合は、データの挿入時にこのフィールドが指定されていないことを意味します。NULL 値が指定された場合は、NULL 値が最後に格納されます。
mysql> delete from user where id =2; Query OK, 1 row affected (0.02 sec) mysql> select * from orders; +----+--------+ | id | userId | +----+--------+ | 1 | NULL | +----+--------+ 1 row in set (0.00 sec)
元のアドレス: https://juejin.cn/post/7000352993572814885
その他のプログラミング関連の知識についてプログラミングビデオ
にアクセスしてください。 !
以上がMySQL の 6 つの一般的な制約タイプの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

SQLデータベースの構築には、DBMSの選択が必要です。 DBMSのインストール。データベースの作成。テーブルの作成;データの挿入;データの取得。データの更新。データの削除。ユーザーの管理。データベースのバックアップ。
