3 - フィールド制約 | MySQL インデックス | MySQL ユーザー管理

フィールドの制約

テーブル ヘッダーに設定して、
次のようなフィールド割り当てを制限します。

  • フィールドに null 値を割り当てることを許可するかどうか。デフォルトでは、null 値の割り当てが許可されています。
  • デフォルト値が設定されていない場合、mysql サービスはデフォルトで null 値を割り当てます。
  • キー値: フィールドに設定されたラベルです。各ラベルには独自の機能があります。デフォルトのフィールドにはラベルがありません。
  • 追加の設定フィールドは自動増加できますが、デフォルトでは自動増加設定はありません。

テーブルのフィールド制約を表示するには、次のコマンドを使用します。

mysql > desc db1.t1

ここに画像の説明を挿入します
テーブルを作成するときは、テーブル ヘッダーのデフォルト値を設定し、NULL 値を許可しないでください。

create table db1.t31(name char(10) not null,class char(7) default "xxx",likes set("money","game","film") not null default "film,music");
  • 既存のテーブルのフィールドのデフォルト値を変更する
create table db1.t34 (name char(10),age tinyint); # 建表是没有设置默认值和不允许为null
desc db1.t34

ここに画像の説明を挿入します

alter table db1.t34 modify name char(10) not null default "" ,modify age tinyint unsigned not null default 25; # 修改字段不允许为null 设置默认值

ここに画像の説明を挿入します

主キー

テーブル構造を表示すると、キー列には次の内容が含まれます。

  • 一意のインデックスフィールドの一意の値(ヘッダー値は繰り返し不可、null 値は繰り返し可能)
create table DB1.t43(name char(10),hz_id char(18) unique); # 身份证号唯一 
mysql > insert into DB1.t43 values("bob",null)
  • 主キー ヘッダーの値を null にすることはできず、繰り返すこともできません。
    テーブル構造内のキー マークは PRI
    ここに画像の説明を挿入します
    構文形式 1 です。
mysql> create table db1.t35(name char(10),hz_id char(10) primary key ,class cahr(10));

文法形式 2:

mysql> create table db1.t36(name char(10),hz_id char(10),class char(10),primary key(hz_id))

ここに画像の説明を挿入します
主キー削除コマンドの形式では、主キーの制限を受けることなく、テーブル ヘッダーの下にデータが保存されます。

alter table db1.t36 drop primary key;

主キーラベルを追加する

alter table db1.t36 add primary key(hz_id)
  • 複合主キー:
    複数のテーブル ヘッダーが主キーとして一緒に使用されます。複合主キー フィールドの値を同時に繰り返すことはできず、NULL 値を割り当てることもできません。
    ここに画像の説明を挿入します
mysql> create table db1.t37(cip varchar(15),port smallint ,status enum("allow","deny"),primary key(cip,port))

ここに画像の説明を挿入します
複合主キーを削除する

alter table db1.t37 drop primary key; # 不能单个删除

複合本館を追加

alter table db1.t37 add primary key(cip,port);

主キーの使用法の概要: 1 つのテーブル ヘッダーが主キーとして使用されるか、複数のテーブル ヘッダーが主キー制約として使用されるかに関係なく、重複値と null 値をテーブルに割り当てることはできません。

  • 主キーは auto_increment と組み合わせて使用​​されます。
    ヘッダーに auto_increment 属性が設定されている場合、レコードの挿入時にヘッダーに値が割り当てられていない場合、ヘッダーには計算結果に 1 を加えた値が割り当てられます
    。ヘッダーに自己インクリメント機能を持たせたい場合は、主キーが必要です。
    テーブル構造を表示するときに追加の位置に表示されます
create table db1.t38(行号 int primary key auto_increment ,姓名 char(10),班级 char(7),住址 char(10));
insert into db1.t39(姓名,班级,住址) values("bob","nsd2107","bg");
insert into db1.t39(姓名,班级,住址) values("bob","nsd2107","bg");

ここに画像の説明を挿入します
自己増加フィールドの値をカスタマイズすることもできます。
自己増加列が切り捨てられたら、削除して 1 から始まる番号を付け続けます。

既存のテーブルに行番号フィールドを追加

alter table db1.t3 add id int primary key auto_increment first;

外部キー

外部キーの中心的な考え方: データの一貫性の確保。
レコードを挿入するとき、フィールド値は別のテーブルのフィールド値の範囲内で選択されます。
外部キーを使用するためのルール:

  • テーブルストレージエンジンはinnodbである必要があります
  • フィールド タイプは一貫している必要があります
    外部キー: 外部キー
    作成外部キーのコマンド形式
create table 库.表名(表头列表,
foreign key(表头名)  # 指定外键
references 库.表(表头名) # 指定参考的表头
on update cascade  # 同步更新
on delete cascade # 同步删除
)engine=innodb;

給与計算書の作成

create table db2.gz(gz_id int ,pay float(7,2),
foreign key(gz_id) references yg(yg_id)
on update cascade on delete cascade
)engine=innodb;

ストレージ エンジンを表示する
ここに画像の説明を挿入します

外部キー名を使用して外部キーを削除し、テーブルヘッダーの外部キー設定を削除します。

alter table db2.gz drop FOREIGN KEY gz_idfk_1(外键名)

既存のテーブルに外部キーを追加する

alter table 库.表 add foreign key(表头名) references 库.表(表头名) on update cascade on delete cascade;

MySQLインデックス

インデックスの紹介

テーブルヘッダーにインデックスラベルを追加すると、テーブルヘッダー以下のデータに対してキューイング情報が生成され、
テーブルに対応するファイル(テーブル名.ibd)に格納されます。 db1 データベースの下の t3 テーブル、
対応するストレージ ファイルは /var/lib/mysql/db1/t3.ibd です。
ここに画像の説明を挿入します

長所と短所

アドバンテージ:

  • 検索速度が大幅に向上
  • サーバーによってスキャンされるデータの量を削減します。
  • ランダム IO をシーケンシャル IO に変換する
  • サーバーがソートや一時テーブルを回避できるようにすることができます
    。 欠点:
  • テーブルの変更速度を遅くする
  • ディスク容量を占有している

インデックスの使用ルール

  • テーブルには複数のインデックスを含めることができます
  • インデックスは通常、where 条件のフィールドに設定されます。
  • 繰り返し可能、NULL 値も可能
  • インデックスインデックスフィールドフラグは mul です

指数の分類

  • 通常のインデックス値はテーブルにインデックスを追加します(インデックス)
  • 一意のインデックス
  • 全文索引 char archar テキスト型のデータ量が比較的多い (フルテキスト)
  • 単一列インデックス (インデックス(名前))
  • 複数列インデックス (index(名前, 年齢...))

インデックス管理

  • 通常のインデックス(インデックス)を作成する
    • テーブル作成時にインデックスを作成する
create database if not exists home; 
use home ;
create table tea4 (
id char(6) not null,
name varchar(6) not null,
age int(3) not null,
gender enum('boy','girl') default 'boy',
index(id),index(name)
);

新しく作成された tea4 テーブルのフィールド構造を見ると、空ではない 2 つのインデックス フィールドの KEY フラグが MUL であることがわかります。

mysql> DESC tea4;
+--------+--------------------+------+-----+---------+-------+
| Field  | Type               | Null | Key | Default | Extra |
+--------+--------------------+------+-----+---------+-------+
| id     | char(6)            | NO   | MUL | NULL    |       |
| name   | varchar(6)         | NO   | MUL | NULL    |       |
| age    | int(3)             | NO   |     | NULL    |       |
| gender | enum('boy','girl') | YES  |     | boy     |       |
+--------+--------------------+------+-----+---------+-------+

インデックスの詳細を表示する

//查看详细信息
mysql> SHOW INDEX FROM tea4\G
*************************** 1. row ***************************
        Table: tea4
   Non_unique: 1
     Key_name: id
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE                          //使用B树算法
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: tea4
   Non_unique: 1
     Key_name: name                      //索引名称
 Seq_in_index: 1
  Column_name: name                           //字段名称
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
  • インデックスの削除
drop index id on home.tea4; # 删除name字段的索引
  • インデックスの追加
create index nianling on tea4(age);      //针对指定字段创建索引
  • select が query Explain コマンドにインデックスを使用するかどうかを確認する
explain select * from db1.t3 where name='sshd';

ここに画像の説明を挿入します
db1 データベースの下の t3 テーブルにインデックス名を追加します。

create index xingming on db1.t3(name)

ここに画像の説明を挿入します

ユーザー管理

ユーザー認証

  • ユーザー認証とは何ですか?
    データベース管理者は、root ユーザーとしてサービスにログインした後、一般ユーザーの設定権限とユーザー パスワードを追加します。
    デフォルトでは、データ管理者のルートのみがこのマシン上のデータ サービスにアクセスできます。デフォルトでは、他のクライアントや他のユーザーはこのマシン上のデータ サービスにアクセスできません。
  • ユーザー認可コマンド形式
grant 权限列表 on 库名 to 用户名@"客户端地址" identified by "密码" [with grant option](可以用grant添加权限)

ライブラリ名: 表現:
ここに画像の説明を挿入します
許可リスト:

  • ALL はすべての権限を意味し、すべてのコマンドを意味します
  • USAGE は権限がないことを意味します (表示を除き、表示説明権限はありません)。
  • SELECT、UPDATE、INSERT は個々の権限のみを表します
  • SELECT、UPDATE (フィールド 1、フィールド n) は、権限が指定されたフィールドへのアクセス権のみを持つことを示します。

ユーザー名: ユーザーを追加するときにカスタマイズでき、mysql ライブラリのユーザー テーブルのユーザー フィールドに保存されます クライアント
アドレス: ネットワーク上のどのホストが追加されたユーザーを使用してデータベース サービスに接続できるか 表現方法は:

  • % はネットワーク内のすべてのメインホストを表します
  • 192.168.4.% は、192.168.4 ネットワーク セグメント内のすべてのホストを意味します
  • 192.168.4.1 は、192.168.4.1 のみがホストであることを意味します
  • localhost はデータベース サーバーのローカル マシンを表します。

Grant オプションを使用すると、追加されたユーザーは Grant コマンドを使用して別のユーザーを追加できますが、ユーザーは mysql ライブラリに対する挿入権限を持っている必要があります。

許可が取り消されました

  • 既存の許可されたユーザーの権限を削除します
  • ライブラリ名は、認可時と同じ方法で表現する必要があります
    。構文:
revoke 权限列表 on 库名 from 用户名@"客户端地址";

追加したユーザーを削除する

drop user 用户名@"客户端地址";

2 つのホスト 50 データベース サーバー 51 クライアント

  1. すべてのライブラリとすべてのテーブルに対する完全な権限と承認権限を持つユーザー dba007 を追加します。パスワードは 123qqq...A です。クライアントはネットワーク内のすべてのホストです。
mysql > grant all on *.* to dba007@"%" identified by "123qqq...a" with grant option;
# 查看已添加的用户权限
mysql > show grants for dba007@"%";
+---------------------------------------------------------------+
| Grants for dba007@%                                           |
+---------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'dba007'@'%' WITH GRANT OPTION |
+---------------------------------------------------------------+

ログインしたユーザーは自分のアクセス権を表示します

mysql> show grants;

//查看可以使用root用来连接的客户端地址
mysql> select host,user from mysql.user where user="root";
+-------------+------+
| host        | user |
+-------------+------+
| 192.168.4.% | root | //192.168.4.0/24 网段所有主机
| localhost   | root |  //本机登录
+-------------+------+
2 rows in set (0.00 sec)
  1. 192.168.4.0/24 ネットワーク セグメントのホストが root を使用してデータベース サーバーに接続できるようにします。ホストにはすべてのライブラリとすべてのテーブルに対する完全な権限があり、パスワードは 123qqq…A です。
[root@host51 ~]# mysql -h192.168.4.50 -udba007 -p123qqq...a
mysql> grant all on *.* to root@"192.168.4.%" identified by "123qqq...a";
mysql> select user,host  from mysql.user;

ここに画像の説明を挿入します
3. このマシンから root アクセス許可を取り消し、さらに取り消します。

[root@host50 ~]# mysql -hlocalhost -uroot -pNSD123...a
//查看登录用户信息
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> revoke all on *.* from root@"localhost";
mysql> show grants;
+--------------------------------------------------------------+
| Grants for root@localhost                                    |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'root'@'localhost'                     |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. ルートローカルログイン権限を復元する
[root@dbsvr1 ~]# mysql -h192.168.4.50 -udba007 -p123qqq...A //dba007用户登录
//设置root用户本机登录的权限 
mysql> grant all on  *.* to root@"localhost" identified by "NSD123...a" with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW GRANTS FOR root@localhost;              //查看权限
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | //有了
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. 任意のホストが webuser ユーザーを使用してデータベース サーバーに接続できるようにします。tarena データベースのみがレコードのクエリ、挿入、更新、削除を行う権限を持ちます。パスワードは 123qqq...A です。
//数据库管理员本机登录
[root@host50 ~]# mysql -hlocalhost -uroot -pNSD123...a
mysql> grant select,insert,update,delete on tarena.* to webuser@"%" identified by "123qqq...A";
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show grants for webuser@"%";  //查看webuser用户权限 ,对所有库表没有任何软件仅对tarena库有权限
+---------------------------------------------------------------------+
| Grants for webuser@%                                                |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'%'                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `tarena`.* TO 'webuser'@'%' |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. Webuser ユーザーの権限を取り消し、レコードをクエリする権限のみを持つようにします。
//在50主机管理员登录
[root@host50 ~]# mysql -hlocalhost -uroot -pNSD123...a
mysql>
//撤销 webuser用户权限,使其仅有查询记录权限。
mysql> revoke insert,update,delete on tarena.* from webuser@"%";
Query OK, 0 rows affected (0.00 sec)
//查看webuser用户权限
mysql> show grants for webuser@"%";
+---------------------------------------------+
| Grants for webuser@%                           |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'%'          |
| GRANT SELECT ON `tarena`.* TO 'webuser'@'%' | //只剩select权限了
+---------------------------------------------+
2 rows in set (0.00 sec)
  1. ユーザー dba007 を削除します
//查看已有的授权用户 是否有dba007用户
mysql> select user , host from mysql.user where user="dba007";
+--------+------+
| user   | host |
+--------+------+
| dba007 | %    |
+--------+------+
1 row in set (0.00 sec)
//删除dba007用户
mysql> drop user dba007@"%";
Query OK, 0 rows affected (0.00 sec)

ユーザー権限の追加

grant select on *.* to bob@"%" identified by "Ammm"
# 追加权限
grant insert on *.* to bob@'%'

認可ライブラリ mysql ライブラリの使用: Grant コマンドの実行結果の保存では、異なる認可情報を保存するために 4 つのテーブルが使用されます。

mysql> use mysql;
mysql> show tables;

ここに画像の説明を挿入します
テーブル レコードを表示することで、既存の許可されたユーザーとアクセス権を取得できます。
また、テーブル レコードを変更して許可されたユーザーのアクセス権を変更することもできます。

ユーザーテーブルの使用

現在のデータベース サービスの既存ユーザーを表示する

select host,user,authentication_string from mysql.user;
# user字段存储用户名
# host字段存储客户端地址
# authentication_string存储链接密码

おすすめ

転載: blog.csdn.net/shengweiit/article/details/135330097