MySql におけるインデックスと制約の使用法と違い

帅杰杰
リリース: 2020-05-01 14:37:56
オリジナル
194 人が閲覧しました

1. インデックスとは何ですか?

インデックスは、MySQL がデータを効率的に取得するのに役立つデータ構造です。

データの保存に加えて、データベースは特定の検索アルゴリズムを満たすデータ構造も維持し、これらのデータ構造は何らかの方法でデータを参照 (ポイント) するため、これらのデータ構造に高度な検索アルゴリズムを実装できます。このデータ構造がインデックスです。インデックスを使用すると、MySQL の取得速度が大幅に向上します。

MySQL では、主キー列に対して、MySQL が自動的に一意とインデックスを確立します。

a. インデックスの作成:

create table 表名(
    id int not null,
    name varchar(10) not null,
    index(name(length))      //使用name字段作为索引
);
ログイン後にコピー

b. インデックスの表示:

show index from 表名;
ログイン後にコピー

2. 制約とは何ですか?

制約は、データの整合性と一貫性を保証するためのもので、制約内のフィールドの数に応じて、制約は列レベルの制約とテーブルレベルの制約に分けられます。 列レベルの制約: 特定のフィールドに使用されます。

テーブルレベルの制約: 2 つ以上のフィールドに使用されます。

制約の種類non-null制約主キー主キー制約一意のキー一意の制約デフォルトデフォルト制約外部キー外部キー制約1)、一意(upique)制約
定義not null
一意制約は、データベーステーブル内の各レコードを一意に識別します。

一意キー制約と主キー制約の両方により、列の一意性が保証されます。

主キーは一意制約として自動的に定義されます。

注: 各テーブルには複数の一意制約を設定できますが、各テーブルに設定できる主キー制約は 1 つだけです。

alter table 表名 drop index name;
ログイン後にコピー

2)、デフォルト制約

は、対応する列の値のデフォルト値を制約するために使用されます(デフォルト値がnullでない限り、null値を挿入できません)。

//第一种方式
create table persons(
  id_p int not null,
  address varchar(255),
  city varchar(255),
  phone varchar(11) unique    //定义字段的同时,定义约束  
);

//第二种方式
create table persons(
    id_p int not null,
    address varchar(255),
    city varchar(255),
    phone varchar(11),
    unique phone(phone)      //单独一行命令,定义约束
);

//第三种方式
alter table persons add unique city(city);  //表后添加(修改表)
ログイン後にコピー

3)、主キー制約

各データテーブルは主キーを 1 つだけ持つことができ、主キーはレコードの一意性を保証し、主キーは自動的に null ではなくなります (レコードのインデックスとしても機能します)。テーブル)。 主キーのないテーブルに主キーを追加する

create table persons(
    id tinyint primary key auto_increment,
    name varchar(30),
    sex enum('m','w')default 'm'   //定义sex默认值为'm'
);
ログイン後にコピー

4)、外部キー制約


外部キー制約は、データの一貫性と整合性を維持し、1対1または多対を実現するためのものです。 -多くの関係。

子テーブル (外部キー列を持つテーブル) と親テーブル (子テーブルによって参照されるテーブル) の場合、ストレージ エンジンは innoDB のみにすることができます。

  • 外部キー列と参照列は同様のデータ型である必要があります。

    数値型の場合、数値と符号ビットの長さが同じである必要があるかどうか
  • 文字型の長さは異なっていてもかまいません

    外部キー列と参照列はインデックスを作成する必要があります(作成しない場合)外部キー列にインデックスが存在する場合、MySQL は自動的にインデックスを作成します)。

  • alter table 表名 add primary key (字段名);
    ログイン後にコピー
  • 3. 制約の削除

a. 主キーの削除

//先创建父表,子表才能建外键,父表和子表必须都是innodb引擎。

//city父表
create table city(
    id tinyint primary key,
    name varchar(10) not null
)engine=INNODB;

//students子表
create table students(
  id tinyint primary key auto increment,
  //定义字段时同时定义
  city tinyint,  //外键字段类型要与主表相同
  foreign key(city) references city(id),  //city字段作为外键,引用city表中的id
  )engine=INNODB;
  
  //主表的数据可以修改,但不能删除
  //删除city中的记录
  delete from city where id=1;
  
  //创建外键以后,再删除city记录,就会报错
  ERROR 1451(23000):Cannot delete or update a parent row:
  a foreign key constraint fails(`hxsd`.`students`,
  CONSTRAINT `students ibfk 1` FOREIGN KEY(`city`) REFERENCES `city`(`id`)
ログイン後にコピー
c. 外部キー制約の削除

alter table 表名 drop primary key;
ログイン後にコピー

関係


インデックスはデータベース自体を指向しており、クエリの最適化などの操作に使用されますが、制約はビジネス関係に関するものです。

通常、一意制約を作成すると、一意インデックスが自動的に取得されます。これは、データベースを一意にチェックするときに、フィールドにインデックスがあった方が高速であるとデータベースが判断するためです。そのため、一意制約が作成されると、一意のインデックスがデフォルトで作成されます。同様に、共通の主キーは一意性制約およびインデックスです。ただし、not null などの制約がある場合、データベースはインデックスを作成しません。

以上がMySql におけるインデックスと制約の使用法と違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
1
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!