7.5 MySQLの制約制御

データベース整合性の制約

(1) エンティティの完全性

テーブル内の識別子列または主キーの整合性を強制します
(例: 主キー制約、一意制約)

(2) 参照整合性(参照整合性)

参照整合性により、レコードの削除および入力時にテーブル間に定義された関係が保持され、キー値がすべてのテーブルで一貫していることが保証されます。

(3) ユーザー定義の整合性

ドメインの整合性を含む、ユーザー定義のビジネス ルール。タイプ、形式、値の範囲などが含まれます。


MySQL の一般的な制約

1. 主キー制約(PRIMARY KEY)

基本テーブルの主キーを定義するために使用され、一意の識別子として機能します。(不能为NULL,不能重复)

  • 列制約の定義 ([[#1 単一主キー|主キーとして単一列]])
字段名 数据类型 [其它约束] PRIMARY KEY
  • テーブル制約の定義の場合 ([[#2 複数の主キー|複数の列を主キーとして結合]])
PRIMARY KEY (列名[,列名])

(1) 単一の主キー

[例7-18] Stuテーブルを作成し、Stuの主キーとしてSnoを定義します。

CREATE TABLE Stu
Sno char(6) PRIMARY KEY,
Sname char(8),
Ssex char(2),
Zno varchar(20));

また

CREATE TABLE Stu
Sno char(6) NOT NULL,
Sname char(8),
Ssex char(2),
Zno varchar(20),
PRIMARY KEY(Sno)
);

(2) 複数の主キー

[例 7-20] 主キーが Sno と Cno で構成される SC テーブルを作成します。

create table sc
sno char(12),
cno char(10) , 
score int,
primary key(sno,cno)
);

(3) 既存のテーブルに主キー制約を追加する

ALTER TABLE Stu
ADD PRIMARY KEY (Sno);

(4) 既存の主キー制約を削除する

ALTER TABLE Stu
DROP PRIMARY KEY;

2. 外部キー制約(FOREIGN KEY)

子テーブルの外部キーは親テーブルの主キーを参照します

[FOREIGN KEY (子表列名表)] REFERENCES 父表名(列名表)
[ on delete [ cascade | restrict | set null | no action ]]
[ on update [ cascade | restrict | set null | no action ]]

cascade: カスケード削除。つまり、主キー テーブルの削除と外部キー テーブルの削除を同時に行います。

学科テーブルの学科が削除された場合、学生テーブルの削除された学科番号に対応する学科の情報を問い合わせたい場合、この学科はもう存在しないためエラーが報告されますので、接続時に学科を削除してくださいテーブル (主キー テーブル) を削除するには、それに関連付けられている他のテーブルを削除する必要があります。これは、データの一貫性と整合性を維持するための外部キーの役割を説明します。もちろん、一方で、student テーブルのレコードを削除しても、学部テーブルのデータには影響せず、学部番号を正しくクエリできます。したがって、外部キー テーブルのデータを削除しても、主キー テーブルには影響しません。

set null: 値が Set Null の場合、主キー テーブルの対応するレコードを削除するときに、まずレコードに対応する外部キーがあるかどうかを確認し、存在する場合は子テーブルの外部キーの値を null に設定します。

アクションなし、制限: デフォルト; 操作を拒否することを意味します。親テーブルの主キーが子テーブルによって参照されている場合、親テーブルの主キーが削除されると、操作は拒否されます。

NO ACTION と RESTRICT の違い: 違いが生じるのは個別の場合のみです。前者は他の制約のアクションの後に実行され、後者は最も高い優先度で実行されます。

例: SCテーブルを作成し、外部キーとしてSnoを定義し、Sテーブルのsnoを参照する

CREATE TABLE SC
(Sno char(6),
 Cno char(3),
 Score Int,
PRIMARY KEY (Sno, Cno),
FOREIGN key (Sno) REFERENCES S(Sno)
 )ENGINE=InnoDB;

注: MyISAM ストレージ エンジンは外部キーをサポートしていません。


3. 非ナル値制約(非ナル値)

注意:NULL不同于0、""、空格、'NULL'

(1) 文法

属性名 数据类型 [NULL | NOT NULL]

(2) 例

S テーブルを作成し、Sname フィールドを空でないように設定します。

CREATE TABLE S
(Sno char(6),
Sname char(8) NOT NULL,
Ssex char(2),
Sbirth date);

(3) 既存のテーブルの属性に非null制約を追加する

すでに作成されている Stu テーブルの Sname フィールドに非 null 制約を設定し
、modify を使用してそれを変更する場合、ADD を使用してそれを増やすことはできません。

ALTER TABLE S
MODIFY Sname char(8) not null;

4. 唯一の制約 (UNIQUE)

基本テーブル内の特定の列または複数の列の組み合わせの値が一意である必要があることを示します。UNIQUE
制約を確立するときは、次の要素を考慮する必要があります。

  • テーブルには を含めることができます多个UNIQUE约束
  • UNIQUE 制約を満たすフィールド允许取NULL值
  • UNIQUE 制約は複数のフィールドに定義できます。
  • 一意制約は、指定されたフィールドに一意のインデックスを自動的に作成します。一意制約を削除すると、インデックスを直接削除できます。

(1) 単一の属性

[例 7-26] Dept テーブルを作成し、Dname を唯一の制約として定義します

CREATE TABLE Dept
(Dno char(6)PRIMARY KEY,
 Dname,varchar(20) UNIQUE,
 Tel char(13),
 Address varchar (20)
 );

(2) 複数の属性

【例】SCテーブルを作成し、ユニークキーとしてSno+Cnoを定義します。

CREATE TABLE SC
(Sno char(6),
Cno char(8),
Score int,
UNIQUE (Sno,Cno)
);

(3) テーブルはすでに変更されています

ALTER TABEL S
MODIFY SNO char(20) NOT NULL UNIQUE;

(4) PRIMARY KEYとUNIQUEの違い

  • 基本テーブルには PRIMARY KEY は 1 つだけ存在できますが、UNIQUE は複数存在できます。
  • PRIMARY KEY として指定された 1 つの列または複数の列の組み合わせの場合、どの列も NULL 値を持つことはできません。UNIQUE によって制約された一意のキーの場合は、NULL が許可されます。

5. デフォルト制約 (DEFAULT)

フィールドにデフォルト値を追加する

(1) 構文形式:

字段名 数据类型 [其它约束] DEFAULT 默认值

(2) 例

コースCテーブルを作成し、コース候補者数の上限のup_limitフィールドにデフォルト値制約を設定します。デフォルト値は整数の100人です。

CREATE TABLE C
(Cno char(8),
 Cname varchar(20),
 up_limit int default 100
);

6. 自己増加制約 (AUTO_INCREMENT)

  • これは自動拡張された整合性制約であり、新しいレコードがテーブルに挿入されると、フィールドの値によって一意の ID が自動的に生成されます。
  • テーブル内に作成できる制約は 1 つだけです。制約は である必要があります整型

(1) 文法形式

列名 数据类型 AUTO_INCREMENT

(2) 例

部門テーブル Dept テーブルを作成し、部門番号が自動的に増加するように要求します。

CREATE TABLE Dept1
(Dno INT PRIMARY KEY AUTO_INCREMENT,
 Dname varchar(20) UNIQUE,
 Tel char(13),
 Address varchar (20)
);

这种递增的列必须为主键,AUTO_INCREMENT必须配合PRIMARY KEY


7. 制約に名前を付けることができます (制約)

(1) デフォルトのネーミング

名前が付けられていない場合、制約の作成時にシステムが自動的に制約に名前を付けます。この
ステートメントを使用して、制約を含むテーブルの作成に使用されたコマンドを表示できます。

show create table <表名>

(2) カスタム命名

[例 3-12] 名前付き制約を含む SC テーブルを作成します。

CREATE TABLE SC1
(Sno char(8),
 Cno char(4),
 Grade INT default 100 null,
 Primary key(sno,cno),
 constraint s_sc_fk
 Foreign key (sno) references Stu(sno)
 ) ;

7. 制約の削除

(1) 主キーを削除する

alter table test 
drop primary key;

(2) 外部キー制約の削除

test_ibfk_1 という名前の外部キー制約を削除します。

alter table test 
drop foreign key test_ibfk_1;

(3) 固有制約を削除する

alter table tableName 
drop index key_name;

(4) デフォルト制約の削除

ALTER TABLE <数据表名> 
CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;

おすすめ

転載: blog.csdn.net/qq_25887493/article/details/123901488
おすすめ