ホームページ >データベース >mysql チュートリアル >MySQL の制約とインデックスの概念とは何ですか

MySQL の制約とインデックスの概念とは何ですか

WBOY
WBOY転載
2023-05-26 10:04:491325ブラウズ

1. リレーショナル データベースの設計ルール

ER モデルと 3 つのパラダイムに従います

  • E エンティティは、データベース内のテーブルに対応するエンティティを表します

  • R 関係は関係の意味を表します

3 つの正規形:

1. 列は分割できません

2 、一意の識別

3. 関係参照主キー

具体的な実施例

  • データをテーブルに入れてから、そのテーブルをデータベース。

  • データベースには複数のテーブルが存在することがあり、各テーブルにはそれ自体を識別するための名前があります。テーブル名は一意です。

  • テーブルには、Java や Python の「クラス」の設計と同様に、データをテーブルに格納する方法を定義するいくつかの特性があります。

  • #テーブルは列 (フィールドとも呼ばれます) で構成されます。データ テーブルの設計は、実際には各フィールドの意味の設計と説明です。データテーブルを作成するときは、各フィールドのデータ型を指定し、データ長と名前を定義する必要があります。各フィールドは、Java または Python の「インスタンス属性」に似ています。

  • テーブル内のデータは行に格納され、1 つの行がレコードになります。各行は、Java または Python の「オブジェクト」に似ています。

MySQL の制約とインデックスの概念とは何ですか

2. データの整合性、制約、インデックスの概念

1. データの整合性 (データの整合性) は、データの正確性を指します。この点は、意味規定に従わないデータがデータベース内に存在することを防ぐとともに、誤った情報の入出力による不正な操作やエラーメッセージを回避することを目的としています。整合性は、次の 4 つの側面から考慮する必要があります。

エンティティの整合性: たとえば、同じテーブル内に同一で区別できない 2 つのレコードがあってはなりません
  • ドメイン整合性: 例: 年齢範囲 0 ~ 120、性別範囲「男性/女性」
  • 参照整合性整合性): 例: 従業員の所在地の部門、この部門は部門テーブルで見つかる必要があります。
  • ユーザー定義の整合性: 例: ユーザー名は一意であり、パスワードは一意ではありません。空の場合など、その部門の給与はこの部門のマネージャーは、この部門の従業員の平均給与の 5 倍を超えてはなりません。
  • 2. 制約 (CONSTRAINTS)
制約は、実装および使用されます。データ ビジネス ルールとデータの整合性を維持します。制約の範囲は現在のデータベースに限定されます。制約はデータベース オブジェクトとして扱うことができます。制約には名前と関連付けられたパターンがあり、論理的な制約です。制約の設定に追加コストはかかりません。スペースを占有します。 .

3. インデックス (INDEX)

インデックスは、データ ページに保存される別個の物理データベース構造であり、1 つまたは複数の列値のコレクションおよび対応するセットです。テーブル テーブル内のデータ値の物理的な識別データ ページを指す論理ポインタのリスト (新華辞典のディレクトリ インデックス ページと同様) インデックスの存在により、データベースの記憶領域が増加します。また、データの挿入と変更にかかる時間のオーバーヘッドも増加します (データの挿入と変更時にインデックスもそれに応じて変更されるため) が、クエリ速度を大幅に向上させることができます。そのため、キー列またはその他の列にインデックスを確立する必要があります。頻繁にクエリ、ソート、および範囲による検索が行われます。非常に頻繁にクエリが実行される場合、めったに使用および参照されない列、頻繁に変更される列、値が少ない列 (性別のみ男性、

①Mysql インデックスは主キー、一意キー、および外部キーのカラムに自動的に作成されます。他のカラムにもインデックスを作成する必要がある場合は、作成する必要があります。 MySQL の制約とインデックスの概念とは何ですか#②主キーを削除すると、対応するインデックスも削除されます

##③削除一意キー方式は、対応するインデックスを削除することで実現されます

#④外部キーを削除します。外部キー列のインデックスはまだ存在します。削除する必要がある場合は、インデックスを個別に削除する必要があります。

3. 制約の適用

1. テーブルの制約とインデックスを表示します。

#查看某个表的约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
或
SHOW CREATE TABLE 表名;
#查看某个表的索引
SHOW INDEX FROM 表名称;

2. 主キー制約: 主キー

(1) 主キーは単一列主キーと複合主キーに分割されます (複合主キーの使用は推奨されません)主キーは 3 つの正規形式に違反しています。 ):

#单个字段设置主键
create table t_user(
	id int primary key,
    username varchar(20),
    password varchar(20)
);
create table t_user(
	id int,
    username varchar(20),
    password varchar(20),
    primary key(id)
);
#多个字段设置联合主键
drop table t_user;
create table t_user(
	id int,
    username varchar(20),
    password varchar(20),
    primary key(id,username)
);
#了解
#在建表后指定主键约束
alter table 表名称 add primary key (主键字段列表);
#删除主键约束
alter table 表名称 drop primary key;

主キーの特性:

1. テーブル内に存在できる主キーは 1 つだけです

    2. 「主キーフィールドの値は一意であり、null ではない」に設定します。
  • 3. 主キーが複数のフィールドで構成されている場合、フィールドの後に主キーを設定することはできませんすべてのフィールドの後に "primary key(" を使用する必要があります。Field, field)"
  • 4. 結合主キーでは、主キーを構成する各フィールドは空ではありません。個別に繰り返すことはできますが、同時に繰り返すことはできません。
  • 5. 主キーを作成すると、対応するインデックスが自動的に作成され、主キーに対応するインデックスを削除すると、削除される。
  • 3. Auto_increment 制約: auto_increment
  • create table t_user(
    	id int primary key auto_increment,
        username varchar(20),
        password varchar(20)
    );
    #建表后指定自增长列
    alter table [数据库.]表名 modify 自增字段名 数据类型 auto_increment;
    #删除自增约束
    alter table 表名 modify 自增字段名 数据类型;

    自動インクリメント制約の特徴:

  • テーブル内の 1 つの主キーのみが auto である必要があります。 -increment type フィールド。このフィールドは整数である必要があり、空にすることはできません。通常、キー制約は主キー制約、一意キー制約、外部キー制約など、主キーにのみ設定されます

2、设置为自增的字段,从1开始自增;每次添加数据,都会在该字段最大值的基础上+1

3、使字段自增的方式:

  • 如果是空或者0,则实际插入的将是自动增长后的值。

  • a> insert into t_user(username,password) values(‘admin’,‘123456’);

  • b> insert into t_user values(null,‘root’,‘123456’); (推荐使用)

  • c> insert into t_user values(0,‘root’,‘123456’);

4、唯一键约束:unique key

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key,
    password varchar(20) unique key
);
create table t_user(
	id int primary key auto_increment,
    username varchar(20),
    password varchar(20),
    unique key(username,password)
);
#在建表后增加唯一键约束
alter table 表名称 add 【constraint 约束名】 unique key (字段名列表);
#如果没有指定约束名,(字段名列表)中只有一个字段的,默认是该字段名,如果是多个字段的默认是字段名列表的第1个字段名。也可以通过show index from 表名;来查看
#删除唯一键约束
ALTER TABLE 表名称 DROP INDEX 唯一性约束名;
#注意:如果忘记名称,可以通过“show index from 表名称;”查看

唯一键约束的特点:

  • 1、设置唯一键约束的字段值唯一,但是可以为null

  • 2、一张表可以设置多个唯一键约束,也可以设置联合唯一键,即多个字段设置一个唯一约束,但是不能使用"unique key"写在字段后设置,必须写在所有字段后,使用"unique key(字段,字段)"

  • 3、联合唯一键要求组成唯一约束的字段可以单独重复,不能同时重复

  • 4、 MySQL会给唯一约束的列上默认创建一个唯一索引。

  • 5、删除唯一键只能通过删除对应索引的方式删除,删除时需要指定唯一键索引名

5、非空约束:not null

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key not null,
    password varchar(20)
);
#在建表后指定某个字段非空
ALTER TABLE 表名称 MODIFY 字段名 数据类型 NOT NULL 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失
#取消某个字段非空
ALTER TABLE 表名称 MODIFY 字段名 数据类型 【default 默认值】;
#如果该字段原来设置了默认值约束,要跟着一起再写一遍,否则默认值约束会丢失

非空约束的特点:

设置为非空约束的字段的值不能为null

6、默认值约束:default

create table t_user(
	id int primary key auto_increment,
    username varchar(20) unique key not null,
    password varchar(20),
    gender char not null default '男'
);

添加数据时使用默认值的方式:

不为该字段赋值或使用关键字default

  • insert into t_user(username,password) values(‘root’,‘123’);

  • insert into t_user values(null,‘admin123’,‘123’,default);

  • insert into t_user values(null,‘admin’,‘123’,null); //此方式不可以,会为该字段赋值为null

7、外键约束:foreign key

表关系:

1、一对一

2、多对一,在多的一方引用一的主键

  • student(sid,sname,age,sex,cid)–clazz(cid,cname,location)

3、一对多,在多的一方引用一的主键

  • clazz(cid,cname,location)–student(sid,sname,age,sex,cid)

4、多对多

  • user(uid,username,password)

  • order(oid,create_time,total_count,total_amount,status,user_id)

  • order_goods(id,oid,gid)

  • goods(gid,gname,price,sales,stock)

create table t_dept(
	id int primary key auto_increment,
    name varchar(20)
);
create table t_emp(
	id int primary key auto_increment,
    name varchar(20),
    age int,
    gender char,
    dept_id int,
    foreign key(dept_id) references t_dept(id) 
    #外键只能在所有字段列表后面单独指定
);
#在建表后指定外键约束
alter table 从表名称 add 【constraint 外键约束名】 foreign key (从表字段名) references 主表名(主表被参照字段名) 【on update xx】[on delete xx];
#删除外键约束
ALTER TABLE 表名称 DROP FOREIGN KEY 外键约束名;
#查看某个表的约束名
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
或
SHOW CREATE TABLE 表名;
#删除外键约束不会删除对应的索引,如果需要删除索引,需要用ALTER TABLE 表名称 DROP INDEX 索引名;
#查看索引名 show index from 表名称;

(1)外键特点

  • 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。

  • 在创建外键约束时,如果不给外键约束名称,默认名不是列名,而是自动产生一个外键名(例如 student_ibfk_1;),也可以指定外键约束名。

  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是列名,不是外键的约束名。

  • 删除外键时,关于外键列上的普通索引需要单独删除。

(2)要求

  • 在从表上建立外键,而且主表要先存在。

  • 一个表可以建立多个外键约束

  • 从表的外键列,在主表中引用的只能是键列(主键,唯一键,外键),推荐引用主表的主键。

  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样

(3)约束关系:约束是针对双方的

  • 添加了外键约束后,主表的修改和删除数据受约束

  • 添加了外键约束后,从表的添加和修改数据受约束

  • 在从表上建立外键,要求主表必须存在

  • 删除主表时,要求从表先删除,或将从表中外键引用该主表的关系先删除

(4)5个约束等级

  • Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录

  • Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null

  • No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

  • Restrict方式:同no action, 都是立即检查外键约束

  • Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别

如果没有指定等级,就相当于Restrict方式

8、检查约束:check

检查约束,mysql暂不支持

create table stu(
	sid int primary key,
	sname varchar(20),
	gender char check ('男'or'女')
);
insert into stu values(1,'张三','男');
insert into stu values(2,'李四','妖');
使用枚举类型解决如上问题:
create table stu(
	sid int primary key,
	sname varchar(20),
	gender enum ('男','女')
);

以上がMySQL の制約とインデックスの概念とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。