フィールド制約 | 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 クライアント
- すべてのライブラリとすべてのテーブルに対する完全な権限と承認権限を持つユーザー 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)
- 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)
- ルートローカルログイン権限を復元する
[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)
- 任意のホストが 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)
- 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)
- ユーザー 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存储链接密码