MySQL - セクション 5 - MySQL テーブルの制約

目次

1. MySQL テーブルの制約の概要

2. 空の属性

3. デフォルト値

4. 列の説明

5.ゼロフィル

6. 主キー

7. 自己成長

8.一意のキー

9. 外部キー

10. 包括的なケース


1. MySQL テーブルの制約の概要

• フィールドを実際に制約するのはデータ型であり、挿入されたデータが対応するデータ型の値の範囲を超える場合、データの挿入は失敗します。
• ただし、データ型の制約は非常に単一であり、データの合法性をより確実にし、ビジネス ロジックの観点からデータの正しさを保証するために、MySQL にはテーブル制約があり、その目的はデータのセキュリティを確保することです。可能な限りユーザーのエラーを減らし、操作の可能性を減らします。
• テーブル制約が多く、このブログでは主にnull/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign keyを紹介しています。


2. 空の属性

• 空の属性には、null と not null の 2 つの値があります。

• データベースのデフォルトフィールドは基本的に空にすることができますが、空の値は操作に参加できないため、実際の開発ではフィールドが空にならないように最善を尽くす必要があります。

たとえば、select を通じて null の値が null であることがわかります。次のように:

NULL 値は演算に参加できないため、NULL 値に 1 を加算した値は NULL のままです。次のように:

フィールドを空にできないようにしたい場合は、テーブルの作成時に対応するフィールドに not null 属性を設定できます。たとえば、クラス名とクラスが存在する教室を含むクラス テーブルを作成します。データを挿入するときにこれら 2 つのフィールドを空にしたくない場合は、データを挿入するときにこれら 2 つのフィールドに not null 属性を設定できます。テーブルを作成しています。次のように:

テーブルを作成した後にテーブル構造を確認すると、これら 2 つのフィールドを空にすることができないことがわかります。次のように:

テーブルにレコードを挿入する場合、これら 2 つのフィールドが空でない場合にのみ挿入が成功します。そうでない場合、挿入は失敗します。次のように:


3. デフォルト値

• フィールドに特定の値が頻繁に表示される場合は、この値をフィールドのデフォルト値として設定することを検討できます。

• テーブルにデータを挿入するときに、デフォルト値を持つフィールドに値を割り当てない場合、挿入にはデフォルト値が使用されます。

たとえば、ユーザーの名前、年齢、性別を含むユーザー テーブルを作成し、ユーザーの年齢をデフォルトで 0 に設定し、ユーザーの性別をデフォルトで男性に設定します。次のように:

テーブル作成後にテーブル構造を確認すると、デフォルト値が正常に設定されていることがわかります。次のように:

テーブルにデータを挿入するとき、ユーザーの年齢または性別が指定されていない場合は、対応するデフォルト値が使用され、指定されている場合はユーザーが指定した値が使用されます。次のように:

not null とデフォルトを同時に設定します。

• フィールドにデフォルト値を設定すると、データの挿入時にフィールドの値が指定されなかった場合でも、フィールドのデフォルト値が入力されるため、フィールドは NULL 値になりません。
• フィールドに not null 属性を設定する目的は、フィールドが空にならないように制限することなので、フィールドにデフォルト属性を設定した後で not null 属性を設定するのは無意味に思えますが、実際には意味があります。これにより、明示的に null を直接挿入することができなくなり、この 2 つは相互に補完的になります。

• フィールドに非 null とデフォルト値を同時に設定します。データの挿入時にフィールドを強制的に null にしても、エラーが報告されます。フィールドを強制的に指定しない場合、フィールドは次のようになります。デフォルト値 フィールドを強制的に指定した場合 特定の値の場合、フィールドは対応する値になります。
名前と ID を含む ID テーブルを作成し、同時に ID のデフォルト属性と null 以外の属性を設定します。次のように:

テーブルの作成後にテーブルの構造を確認すると、id フィールドを空にすることができず、そのデフォルト値が 1 であることがわかります。次のように:

このとき、テーブルにデータを挿入する際にはidを指定せずに挿入することもでき、このときidのデフォルト値が使用されます。次のように:


4. 列の説明

• 列の説明は、テーブルの作成時に各フィールドを説明するために使用されます。列の説明は、テーブル作成ステートメントに従って保存されます。一般に、プログラマまたは DBA がテーブルの関連情報を理解するために使用されます。これは、テーブルの関連情報を理解するために使用されます。コメント。

たとえば、ユーザー名、ユーザーの年齢、性別を含むユーザー テーブルを作成し、各フィールドの後に対応する列の説明を追加します。次のように:

テーブルの作成後、show create table table name; コマンドを使用して、列の説明など、テーブル作成の関連詳細を表示します。次のように:


5.ゼロフィル

• 数値型の後ろの括弧内の数字は表示幅を表し、対応する数値型に zerofill 属性を設定すると、データの幅が設定幅より小さい場合は自動的に 0 で埋められます。

たとえば、整数データの 2 つの列 a と b を含むテーブルを作成し、その表示幅を 5 に設定しますが、zerofill 属性は設定しません。次のように:

a と b の値が両方とも 1 であることを示すレコードをテーブルに挿入します。 a フィールドと b フィールドにゼロフィル属性を設定していないため、テーブル内のデータを表示すると、すべて 1 として表示されます。表示幅の概念はありません。次のように:

テーブル構造を変更し、a列にzerofill属性を追加すると、a列のデータの表示幅が5なので、a列の幅が5桁未満のデータは自動的に先頭に0が埋められることがわかります。テーブル内のデータの。次のように:

zerofill 属性の機能はデータを特定の方法で表示することであり、データの最下層の格納方法は変更されていないことに注意してください。hex 関数を通じて、列に 00001 が表示されていることがわかります。 a は実際には最下層に 1 として格納されます。次のように:

ノート:

1. int の後に (value) を続けることもできます (例: int(11))。int(value) の値は、整数で表示できる最大桁数を表します。

2. テーブルの作成時に int 型の変数を作成するときに int のサイズを指定するかっこがない場合、mysql は、次の図に示すように、signed int の場合は 11、unsigned int の場合は 10 のサイズを自動的に指定します。

整数は 32 ビットに相当します。符号なし整数の場合、その値の範囲は 0 から42 億を2^{32}-1超えます2^{32}-1。符号なし整数のデフォルトは 10 ビットです。これは、42 億を超えるすべての値を表示できるためです。符号付き整数にはもう 1 ビットの符号ビットがあるため、符号付き整数のデフォルトは 11 ビットになります。


6. 主キー

主キー:

• テーブルにレコードを挿入した後、その後の検索を容易にするために、フィールドの 1 つをキー値キーとして選択できます。レコードを検索する必要がある場合は、キーに従って対応するレコードを検索します。値キー。
• 主キーは、フィールド内のデータを一意に制限するために使用されます。テーブル内の各レコードの主キーは、繰り返したり空にしたりすることはできず、テーブル内に存在できる主キーは 1 つだけです。また、主キーが配置される列は、配置されるキーは通常、整数型です。

たとえば、学生の学生番号と名前を含む学生テーブルを作成します。学生の学生番号は重複しないため、主キーとして設定できます。次のように:

テーブルが正常に作成された後、テーブルの構造を確認すると、ID に対応する Key 列に PRI が表示されていることがわかります。これは、学生番号がこのテーブルの主キーとして正常に設定されたことを意味します。また、テーブル作成時に学籍番号にnot null属性を設定していませんが、主キー自体を空にすることはできないため、デフォルトではidを空にすることはできません。次のように:

いわゆる主キー制約とは、テーブルに挿入されたレコードの主キー フィールドを繰り返すことができないというもので、挿入されたレコードの主キーがテーブル内の既存のレコードの主キーと同じである場合、挿入は主キーの競合により失敗します。次のように:

指定したテーブルの主キーを削除するには、alter table table namedropprimary key; コマンドを使用します。テーブルには主キーが 1 つしかないため、主キーを削除するときは、削除するテーブルの主キーを指定するだけで済みます。削除されました。たとえば、student テーブルの主キーを削除してテーブル構造を確認すると、その ID に対応する Key 列の PRI がなくなっていることがわかります。次のように:

作成したテーブルに対して、 alter table table name add Primary key (column name); コマンドを使用して、指定したカラムを主キーとして設定しますが、値が空ではないカラムのみが設定されるので注意が必要です。繰り返し使用可能.を主キーとして設定します。例えば、studentテーブルの主キーである学生番号をリセットしてテーブル構造を確認すると、そのidに対応するKey列のPRIが戻っていることがわかります。次のように:

複合主キー:

• テーブル内に存在できる主キーは 1 つだけですが、主キーは複数のフィールドに保持されることがあり、この主キーは複合主キーと呼ばれます。

• 複合主キーは、複数のフィールドのデータを一意に制限するために使用されます。テーブル内の各レコードの複数のフィールドを同時に繰り返したり、空にしたりすることはできません。

たとえば、プロセスの IP アドレス、ポート番号、およびプロセス関連情報を含むプロセス テーブルを作成し、IP アドレスとポート番号を組み合わせて複合主キーを形成します。次のように:

テーブルの作成後にテーブルの構造を確認すると、ip と port の Key 列に PRI フラグがあり、空にすることは許可されていないことがわかります。次のように:

プロセス テーブルにデータを挿入する場合、主キーの競合は、挿入プロセスの IP とポートが競合する場合にのみ発生します。それ以外の場合、挿入は許可されます。次のように:

テーブルに挿入されたデータを見ると、テーブル内に重複する IP アドレスとポート番号があることがわかりますが、重複する IP とポート番号は存在しません。これは複合主キーの機能です。次のように:

alter table table namedrop Primary key; コマンドを使用して、指定したテーブルの複合主キーを削除します。たとえば、プロセス テーブルの複合主キーを削除してから、テーブル構造を表示します。キー内の PRI が確認できます。 IPとポートに対応する列が消えています。次のように:

すでに作成されているテーブルの場合は、 alter table table name add Primary key (multiple columns names); コマンドを使用して、複数の列を持つ複合主キーを形成することもできますが、選択した複数の列を空にしたり、同時に重複を含めたりすることはできません。たとえば、プロセス テーブルの複合主キーとして ip と port をリセットし、テーブルの構造を確認すると、ip と port に対応する Key 列の PRI が戻っていることがわかります。次のように:

主キーの設計方法:

1. ビジネスと組み合わせて、一意の列属性を主キーとして選択します。

2. ビジネスとは関係のない固有の値を選択します。この設計では、主キーの値はビジネスとは無関係であり、ビジネスの調整が主キー テーブル全体の構造に影響を与えることはありません。例: QQ 番号。


7. 自己成長

• 自己増分プロパティが設定されたフィールドの場合、データの挿入時にフィールドに値が指定されていない場合、システムは現在のフィールド内の既存の最大値を自動的に検索し、その最大値に 1 を加算した値を挿入します。フィールド。
• フィールドが自己増加するためには、そのフィールドがインデックス (主キー、つまりキー列に値がある) であることが前提であり、自己増加フィールドは数値型である必要があり、テーブルは自己増加フィールドは最大 1 つだけです。
• 自己拡張は通常、論理主キーとして主キーと組み合わせて使用​​されます。一般的には、ビジネスロジックの調整による主キーの変更を避けるために、主キーを現在の業務とは関係のないフィールドとして設計することをお勧めします。

たとえば、ID と名前を含むテーブルを作成し、同時に ID を主キーとして設定し、同時に自己増加フィールドとして設定します。次のように:

テーブルの作成後、テーブルの構造を確認すると、id の Extra 列に auto_increment フラグが表示されていることがわかります。次のように:

最初のレコードをテーブルに挿入するときに自動インクリメント フィールドの値が指定されていない場合、自動インクリメント フィールドの値はデフォルトで 1 から始まります。次のように:

後でテーブルにレコードを挿入するときに自己増加フィールドの値が指定されていない場合、自己増加フィールドの値は順番に増加します。次のように:

もちろん、レコードを挿入する際に、自己増加フィールドの値を指定することもできます。このとき、その値が挿入に使用されますが、指定する値は、レコード内の既存の id 値と同じにすることはできないことに注意してください。テーブル。次のように:

その後、テーブルにレコードを挿入するときに自己増加フィールドの値を指定しなかった場合、自己増加フィールドの値はid列から最大値を見つけて、それに1を加えた値を加算します。自己増加フィールドの値として最大値まで挿入します。次のように:

ノート:

1. 通常、自己成長フィールドを設定した後は、フィールドの値を手動で挿入する必要はありません。自己成長のために 1 から開始するだけです。

2. 自己インクリメントの初期値を直接設定したい場合は、次の図に示すように auto_increment オプションを使用できます。

索引:
•  リレーショナル データベースでは、インデックスはデータベース テーブル内の 1 つ以上の列の値を並べ替える別の物理的なストレージ構造であり、これらの値を物理的に識別するテーブル内のデータ ページへの論理ポインタのリストです。インデックスの機能は書籍の目次に相当し、目次のページ番号から必要な内容をすぐに見つけることができます。
•  インデックスは、テーブルの指定された列に格納されているデータ値へのポインタを提供し、指定した並べ替え順序に従ってそれらのポインタを並べ替えます。データベースはインデックスを使用して特定の値を検索し、その値が含まれる行まで処理を進めます。これにより、テーブルに対応する SQL ステートメントの 実行が高速になり、データベース テーブル内の特定の情報に迅速にアクセスできるようになります。


8.一意のキー

• テーブル内には一意性が必要なフィールドが多数あることがよくありますが、テーブル内に存在できる主キーは 1 つだけであり、テーブル内の複数のフィールドが一意性制約を必要とする問題は一意キーによって解決できます。
• 一意キーと主キーの両方でフィールド内のデータの一意性を保証できますが、一意キーではフィールドを空にすることができ、複数のフィールドを空にすることができ、空のフィールドの一意性は比較されません。
• 主キーが一意であるわけではなく、一意のフィールドが主キーとして選択され、主キーではないが一意制約が必要なフィールドは一意キーとして設定する必要があることに注意してください。

• 主キーはむしろ一意性を重視していることが簡単に理解できます。一意のキーは、ビジネスにおいて他の情報と重複しないようにするためのものです。

• 主キーは検索時に一意のレコードが確実に見つかるようにするためのものであり、一意キーはテーブル内のそれぞれの異なる値も mysql レベルで一意である必要があることを保証するものです。
たとえば、学生の ID、名前、電話番号を含む学生テーブルを作成します。主キーとして ID を選択しますが、同時に、各学生の電話番号にも一意の制約が必要であるため、電話番号は一意のキーとして設定されます。次のように:

テーブルの作成後にテーブル構造を確認すると、tel の Key 列に UNI フラグが表示されていることがわかります。これは、tel が一意のキーとして正常に設定されたことを示します。次のように:

テーブルにレコードを挿入するときに、挿入したレコードの電話番号がテーブルにすでに記録されている電話番号と重複している場合、一意のキーの競合により挿入は失敗します。次のように:

また、テーブルに挿入されるレコードでは一意キー フィールドの値が指定されていない場合がありますが、このときフィールドはデフォルトで空であり、一意性の比較は実行されません。次のように:


9. 外部キー

外部キーの構文:

foreign key (字段名) references 主表(列)

• 外部キーは、メイン テーブルとスレーブ テーブル間の関係を定義し、マスター テーブルとスレーブ テーブル間の制約を維持するために使用されます。外部キー制約は主にスレーブ テーブルで定義され、主テーブルには主キー制約または一意キー制約が必要です。

• 外部キーを定義した後、外部キー列に挿入する必要があるデータは、メイン テーブルの対応する列に存在するか、NULL である必要があります。

たとえば、最初にクラス ID とクラス名を含むクラス テーブルをメイン テーブルとして作成し、クラス ID を主キーとして設定します。次のように:

次に、学生の ID、名前、および学生のクラスの対応する ID を含む学生テーブルを二次テーブルとして作成し、学生テーブルのクラス ID 列をクラス ID 列に関連付けられた外部キーとして設定します。クラステーブルにあります。次のように:

テーブルの作成後、student テーブルのテーブル構造を確認すると、student テーブルのクラス ID に対応する Key 列に MUL フラグが付いていることがわかります。これは、class_id が外部キーとして正常に設定されたことを示します。次のように:

外部キー制約を示すために、まずクラス テーブルに 2 つのレコードを挿入します。次のように:

このとき、studentテーブルにレコードを挿入する際、挿入したレコードに対応するクラスidがクラステーブルに存在するか、挿入したクラスidがnullであれば、この時点で挿入が許可されます。次のように:

ただし、student テーブルに挿入されたレコードに対応するクラス ID が 3 の場合、student テーブルに挿入されたレコードに対応するクラスが存在しないことと同じになり、この時点で挿入は失敗します。キー制約。次のように:

このとき、classテーブルにクラスidが3のクラス情報を挿入し、その後、studentテーブルに上記のレコードを挿入すると挿入が許可されます。次のように:

この時点で、class_table テーブルのクラス 2103 を削除したい場合、student_table テーブルにはクラス 2103 の生徒がまだ存在するため、削除できません。次のように:

これは、student_table テーブルのオンライン 研究クラス 2103 のすべての学生を削除し、次に class_table テーブルのオンライン 研究クラス 2103 を削除すると、削除が許可されるためです。次のように:

説明:

• 一般的な外部キーの確立はテーブルから確立されます。

• 理論的には、class テーブルとstudent テーブルの作成後に外部キーを設定しなくても、意味的にはすでに外部キーがありますが、student テーブルに挿入される後続のレコードのクラス ID の正確性は保証できません。
• 学生テーブルのクラス ID を外部キーとして設定すると、外部キー制約により、クラス テーブルのクラス ID を持つレコードのみが学生テーブルに挿入および変更され、クラス ID を持たない学生のみが挿入および変更できるようになります。 Student テーブル内の対応するクラスは、対応するクラスを削除できます。それ以外の場合、挿入、変更、または削除は失敗します。
• 実際に外部キーを確立する本質は、レビューのために相関関係を MySQL に渡し、事前にテーブル間の制約関係を MySQL に伝えることですが、ユーザーがビジネス ロジックに従わないデータを挿入した場合、MySQL はそれを許可しません。入れる。

• 外部キーはテーブル間の関連付けを生成するために使用されるだけでなく、テーブル間のデータの整合性と一貫性を確保するための mysql の特定の制約ルールも備えています。


10. 包括的なケース

ケースの説明:

顧客と買い物状況を記録する店舗データがあり、次の 3 つのテーブルで構成されます。

• 商品テーブル Goods: 商品番号 Goods_id、商品名 Goods_name、単価 Unitprice、商品カテゴリー、サプライヤープロバイダー。
• 顧客テーブル customer: 顧客番号 customer_id、名前 name、住所 address、電子メール アドレス、性別、ID Card_id。
• 購入テーブル Purchase: 注文番号 order_id、顧客番号 customer_id、製品番号 Goods_id、購入数量 nums。
必須:

• 主キー、外部キーを設定します。
• 顧客の名前を空白にすることはできません。
• メールボックスを複製することはできません。
• 顧客の性別 (男性、女性)。

mysql の書き込み:

まず、データベースを作成してから、データベース内にこれら 3 つのテーブルの作成を完了する必要があります。次のように:

商品テーブルを作成する際は、商品番号を主キーとして自己増加フィールドとして設定しますが、その他のフィールドの属性は必須ではなく、自分で無理なく設定できます。次のように:

product テーブルが作成されたら、次のようにテーブル構造を表示します。

顧客テーブルを作成するときは、顧客番号を主キーとして設定し、それを自己増加フィールドとして設定し、名前に非 null 属性を設定し、メールボックスを一意のキーとして設定し、性別を列挙型として設定し、男性と女性の性別オプションのみを提供します。また、タイトルには ID カードは必要ありませんが、通常は ID カードも一意性を保証する必要があり、一意のキーとして設定するのが最善です。次のように:

customer テーブルが作成されたら、次のようにテーブル構造を表示します。

購入テーブルを作成する際、注文番号を主キーとして設定し、自己増加フィールドとして設定することもできますが、顧客番号と製品番号をそれぞれ外部キーとして設定する必要があります。 customer テーブルと product テーブルの製品番号を確認するには、外部キー制約を使用して、各注文の顧客番号と製品番号が存在することを確認します。次のように:

購入テーブルが作成されたら、次のようにテーブル構造を表示します。

おすすめ

転載: blog.csdn.net/qq_45113223/article/details/131279728