1、mysql 安装配置更改密码:
- 1) 下在mqsql 免安装版本,解压至指定路径
- 2) mysql 根目录创建一个data 文件夹和my.ini
E:\software\mysql-8.0.11\data
E:\software\mysql-8.0.11\my.ini
在my.ini下输入以下内容
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=E:\\software\mysql-8.0.11
# 设置mysql数据库的数据的存放目录
datadir=E:\\software\mysql-8.0.11\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10000
# 服务端使用的字符集默认为UTF8 windows 10 1803 版本下不用设置字符集
#mysql> show variables like '%char%';
#+--------------------------+------------------------------------------+
#| Variable_name | Value |
#+--------------------------+------------------------------------------+
#| character_set_client | gbk |
#| character_set_connection | gbk |
#| character_set_database | utf8mb4 |
#| character_set_filesystem | binary |
#| character_set_results | gbk |
#| character_set_server | utf8mb4 |
#| character_set_system | utf8 |
#| character_sets_dir | E:\software\mysql-8.0.11\share\charsets\ |
#+--------------------------+------------------------------------------+
# 配置完成后字符集是utf8mb4
#character-set-server=utf8
# 创建新表时将使用的默认存储引擎
#default-storage-engine=INNODB
#wait_timeout=31536000
#interactive_timeout=31536000
#如果远程工具如sqlyog无法连上提示Authentication plugin 'caching_sha2_password' cannot be loaded
#就加上以下这句
#default_authentication_plugin=mysql_native_password
#sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[mysql]
# 设置mysql客户端默认字符集
#default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
#default-character-set=utf8
配置字符集为utf-8后
mysql> show variables like '%char%';
#+--------------------------+------------------------------------------+
#| Variable_name | Value |
#+--------------------------+------------------------------------------+
#| character_set_client | utf8 |
#| character_set_connection | utf8 |
#| character_set_database | utf8 |
#| character_set_filesystem | binary |
#| character_set_results | utf8 |
#| character_set_server | utf8 |
#| character_set_system | utf8 |
#| character_sets_dir | E:\software\mysql-8.0.11\share\charsets\ |
#+--------------------------+------------------------------------------+
- 3) 将MySQL安装的bin目录添加到环境变量
E:\software\mysql-8.0.11\bin
- 4)用管理员权限打开控制台,进入E:\software\mysql-8.0.11\bin
输入
mysqld --install [服务名]--安装MySQL 服务
mysqld --remove [服务名] --也可以用sc delete 服务名 删除服务
- 5) 初始化:
mysqld --initialize
- 6) 启动服务:
net start mysql(服务名称)
关闭服务net stop mysql -- Windows 10 须在管理员模式下进行
- 7) 登录:
mysql -u root -p
输入密码: –此时的密码是一个随机密码,密码在data目录下的.err文件里面
generated for root@localhost: SpCdaszoz5,p
- 8) 成功登陆之后 开始更改密码:
ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'Root1234';
更改之后就重新登陆就可以使用新密码了
- 9) 为管理员root授权(可选) , 操作过程很奇葩 必须先要删除root用户
再创建它才能用grant – 否则会报
You are not allowed to create a user withGRANT;
-- 是不是很惊喜
一起来看看吧
#mysql> drop user root@localhost;
-- 删除用户
#Query OK, 0 rows affected (0.09 sec)
#mysql> flush privileges;
-- 使得操作生效
#Query OK, 0 rows affected (0.01 sec)
-- 重新创建用户
#mysql> create user root@localhost identified by 'Root1234'; #Query OK, 0 rows affected (0.04 sec)
-- 为用户授权
#mysql> grant all on *.* to root@localhost with grant option; #Query OK, 0 rows affected (0.09 sec)
2、mysql 忘记密码:
这一块儿按照网上的教程还没有成功过
3、数据库的编码一般和本地机器的编码一致.
查看数据库编码:show create database 数据库名;
4、创建数据库:create database 数据库名;
5、查询当前使用的数据库:select database();
6、查询数据库中的表:show tables;
7、数据库中使用的数据类型:
1> 字符类型:
- 固定长度的字符类型:
- char(#number):#number的值范围[0-255]字节 非二进制字符串
- binary(#number):#number的值范围[0-255]字节 二进制字符串没有字符集
- 自动变换长度的字符类型:
- varchar(#number) #number的值范围[0-65535]字节 非二进制字符串
- varbinary(#number) #number的值范围[0-65535]字节 二进制字符串
- blob类型:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
- 固定长度的字符类型:
tinyblob: 0-255字节 不超过 255 个字符的二进制字符串
blob: 0-65535字节 二进制形式的长文本数据 2^16 -1 64 kb
mediumblob: 0-16777215字节 二进制形式的中等长度文本数据 2^24 -1, 2^14kb,2^4Mb,
longblob: 0-4294967295字节 二进制形式的极大文本数据 2^32 -1, 2^22kb,2^12Mb,2^2Gb
- Text类型:tinyblob 类似,存储普通文本数据
tinytext: 短文本字符串
text: 长文本字符串
mediumtext: 中等长度文本数据
longtext: 极大长度文本数据
- char,varchar,text 的常用修饰符:
A>.NOT NULL(非空约束)
B>.NULL(允许为空)
C>.default 'string'(默认值,不适用于text类型)
D>.CHARACTER SET 字符集
mysql>show variables like '%char%'; #查看默认的字符集
mysql>show character set; #查看数据库支持的字符集
E>.collation '规则':排序规则
msyql>show collation; #查看数据库支持的排序规则
2> 数值类型:
精确数值类型:
类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1字节 [-2^7 ,2^7 -1] [0,2^8-1] 小整数值 SMALLINT 2字节 [-2^15,2^15-1] [0,2^16-1] 大整数值 MEDIUMINT 3字节 [-2^23,2^23-1] [0,2^24-1] 大整数值 INT或INTEGER 4字节 [-2^31,2^31-1] [0,2^32-1] 大整数值 BIGINT 8字节 [-2^63,2^63-1] [0,2^64-1] 极大整数值
整形的常用属性修饰符:
A>. AUTO_INCREMENT: 自动增长(前提:非空,且唯一,
支持索引,非负值[UNSIGNED],
注意:TRUNCATE 用来清空表中数据)
B>. LEST_INSERT_ID():可以查看上次增长的数值,当插入
多行时,只记录第一行
C>. UNSIGNED:无符号
D>. NULL
E>. NOT NULL
F>. DEFAULT
近似数值类型:
+----------------------------------------------------------------------------------------+
|类型 | 大小 |范围(有符号) | 范围(无符号) |用途 |
|FLOAT | 4字节 |(-3.402823466E+38, | 0,(1.175494351E-38, |单精度浮点数值 |
| | |-1.175494351E-38), | 3.402823466E+38) | |
| | |0,(1.175494351E-38, | | |
| | |3.402823466351E+38) | | |
|-------+-------+---------------------------+----------------------------+---------------+
|DOUBLE | 8字节 |(-1.7976931348623157E+308, | 0,(2.2250738585072014E-308,| 双精度浮点数值|
| | |-2.2250738585072014E-308), | 1.7976931348623157 E+308) | |
| | |0,(2.2250738585072014E-308,| | |
| | |1.7976931348623157E+308) | | |
|-------+-------+---------------------------+----------------------------+---------------+
|DECIMAL| 对DECIMAL(M,D), |依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
| | 如果M>D,为M+2否 | | | |
| | 则为D+2 | | | |
+----------------------------------------------------------------------------------------+
浮点型常用修饰符:(使用g,f来定义总共有多少数字和小数点后有多少数字)
A>. NULL
B>. NOT NULL
C>. UNSIGNSD
D>. DEFAULT
3> 日期类型:
+--------------------------------------------------------------------------------------+
|类型 |小(字节)| 范围 | 格式 | 用途 |
|DATE |3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
|---------+--------+-----------------------------+------------------+------------------|
|TIME |3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
|---------+--------+-----------------------------+------------------+------------------|
|YEAR |1 | 1901/2155 | YYYY | 年份值 |
|---------+--------+-----------------------------+------------------+------------------|
|DATETIME |8 | 1000-01-01 00:00:00/ | YYYY-MM-DD | 混合日期和时间值 |
| | | 9999-12-31 23:59:59 | HH:MM:SS | |
|---------+--------+-----------------------------+------------------+------------------|
|TIMESTAMP|4 | 1970-01-01 00:00:00/2038 | YYYYMMDD HHMMSS| 混合日期和时间值|
| | |结束时间是第 2147483647 秒, | | 时间戳 |
| | |北京时间 2038-1-19 11:14:07 | | |
| | |格林尼治时间 2038年1月19日 | | |
| | |凌晨 03:14:07 | | |
+--------------------------------------------------------------------------------------+
日期时间型常用的修饰符
A>.NULL
B>.NOT NULL
C>.DEFAULT
- 4> 布尔类型:MySQL其实没有真正意义上的布尔型,而是使用的tinyint(微整型),而且只显示一位来表示的,要么是0,要么是1.
5> null值:表示什么也没有存,注意空白字符不等于空哟,数字0也不代表空。
6> 内置类型:
enum:ENUM是枚举类型,它虽然只能保存一个值,却能够处理多达65535个预定义的值
ENUM('value1','value2','value3','....);
set:set多选字符串数据类型,适合存储表单界面的“多选值”。设定set的时候,同样需要给定“固定的几个选项”;存储的时候,可以存储其中的若干个值。
设定set的格式:
set("选项1","选项2","选项3",...)
同样的,set的每个选项值也对应一个数字,依次是1,2,4,8,16...,最多有64个选项
使用的时候,可以使用set选项的字符串本身(多个选项用逗号分隔),也可以使用多个选
项的数字之和(比如:1+2+4=7)
- 8、查看表的结构:
desc 表名;
- 9、
show create tables student;查看建表使用的sql语句
10、约束:
分类: 主键约束: primary key 外键约束: foreign key 唯一约束: unique 非空约束: not null 自增: auto_increment 无符号约束:UNSIGNED(无符号位) 零填充约束:ZEROFILL(零填充) check 约束:mysql check约束没什么用,check约束只检查,但是不具有约束力 默认值约束:default
1)主键约束:
主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。 创建表时: 列级别添加主键约束: create table student ( id int primary key auto_increment, -- 列级别添加主键约束 name varchar(20) not null, -- 非空约束 sex enum('男','女') default '男', -- default 约束 qqnum varchar(12) ); 表级别添加主键约束: create table teacher ( id int auto_increment, name varchar(20) not null, sex enum('男','女') default '男', phone varchar(11), primary key(id) -- 表级别添加主键约束 ); 也可以通过表级别添加联合主键 例如:constriant `pri_key` primary key(id,name); 表创建好之后: 删除主键约束: mysql> alter table student drop primary key; # ERROR 1075 (42000): Incorrect table definition; # there can be only one auto column and it must be defined as a key mysql> desc student; #+-------+-------------------+------+-----+---------+----------------+ #| Field | Type | Null | Key | Default | Extra | #+-------+-------------------+------+-----+---------+----------------+ #| id | int(11) | NO | PRI | NULL | auto_increment | #| name | varchar(20) | NO | | NULL | | #| sex | enum('男','女') | YES | | 男 | | #| qqnum | varchar(12) | YES | | NULL | | #+-------+-------------------+------+-----+---------+----------------+ 也就是说表中唯一的自增列必须设置为主键 接下来更id 列 alter table student modify id int(11); mysql> desc student; #+-------+-------------------+------+-----+---------+-------+ #| Field | Type | Null | Key | Default | Extra | #+-------+-------------------+------+-----+---------+-------+ #| id | int(11) | NO | PRI | NULL | | #| name | varchar(20) | NO | | NULL | | #| sex | enum('男','女') | YES | | 男 | | #| qqnum | varchar(12) | YES | | NULL | | #+-------+-------------------+------+-----+---------+-------+ 可以看到auto_increment 自增已经没有了 mysql> alter table student drop primary key; #Query OK, 0 rows affected (0.06 sec) #Records: 0 Duplicates: 0 Warnings: 0 mysql> desc student; #+-------+-------------------+------+-----+---------+-------+ #| Field | Type | Null | Key | Default | Extra | #+-------+-------------------+------+-----+---------+-------+ #| id | int(11) | NO | | NULL | | #| name | varchar(20) | NO | | NULL | | #| sex | enum('男','女') | YES | | 男 | | #| qqnum | varchar(12) | YES | | NULL | | #+-------+-------------------+------+-----+---------+-------+ 成功删除主键 添加主键约束: 列级别:更改字段属性,将某一字段设置为主键 mysql> alter table student modify id int(11) primary key; 表级别:可以设置联合主键 mysql> alter table student add primary key(id); 可以通过联合约束的方式添加联合主键 alter table 表名 add primary key(字段1,字段2,..);
2)外键约束: MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。
外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在
建立外键时会自动创建索引,但如果在较早的版本则
需要显示建立;3.外键关系的两个表的列必须是数据类型相似,也就是
可以相互转换类型的列,比如int和tinyint可以,而int
和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
外键格式:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT:(限制外表中的外键改动) 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
CASCADE:(跟随外键改动)
从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。
ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
SET NULL:(设空值)
从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
SET DEFAULT:(设默认值) InnoDB目前不支持。
NO ACTION:(无动作,默认的)InnoDB拒绝删除或者更新父表。
具体操作:
mysql> -- 创建一张班级表,classes(id,name,teacherid);
mysql> -- 为学生表添加字段名 classid 并设置外键关联到班级表
mysql> -- 为班级表设置外键 teacherid
mysql> create table classes(
-> id int primary key auto_increment,
-> name varchar(20),
-> teacherid int,
-> foreign key(teacherid) references teacher(id) on delete cascade on update cascade
-> -- 添加teacherid外键关联到teacher级联删除,级联更新,也就是说 如果teacher 表中的
-> -- id发生删除,会级联删除班级表中对应teacherid的项,teacher表id发生更改,classes表
-> -- 中对应的id号也会对应更改。
-> );
mysql> -- 现在先往teacher表中添加几条数据
mysql> desc teacher;
#+-------+-------------------+------+-----+---------+----------------+
#| Field | Type | Null | Key | Default | Extra |
#+-------+-------------------+------+-----+---------+----------------+
#| id | int(11) | NO | PRI | NULL | auto_increment |
#| name | varchar(20) | NO | | NULL | |
#| sex | enum('男','女') | YES | | 男 | |
#| phone | varchar(11) | YES | | NULL | |
#+-------+-------------------+------+-----+---------+----------------+
mysql> insert into teacher values
-> (null,'关羽','男','18800000001'),
-> (null,'赵云','男','18800000002'),
-> (null,'曹操','男','18800000003'),
-> (null,'小乔','女','18800000004'),
-> (null,'大乔','女','18800000005'),
-> (null,'孙尚香','女','18800000006');
mysql> select * from teacher;
+----+-----------+------+-------------+
| id | name | sex | phone |
+----+-----------+------+-------------+
| 1 | 关羽 | 男 | 18800000001 |
| 2 | 赵云 | 男 | 18800000002 |
| 3 | 曹操 | 男 | 18800000003 |
| 4 | 小乔 | 女 | 18800000004 |
| 5 | 大乔 | 女 | 18800000005 |
| 6 | 孙尚香 | 女 | 18800000006 |
+----+-----------+------+-------------+
mysql> -- 现在已经在teacher表中插入了六条数据
mysql> -- 我们可以在班级表中插入几条数据
mysql> desc classes;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| teacherid | int(11) | YES | MUL | NULL | |
+-----------+-------------+------+-----+---------+----------------+
mysql> insert into classes values
-> (null,'15级计算机1班',1),
-> (null,'15级计算机2班',1),
-> (null,'15级计算机3班',1),
-> (null,'15级计算机4班',1),
-> (null,'15级信息管理1班',2),
-> (null,'15级信息管理2班',2),
-> (null,'15级信息管理3班',2),
-> (null,'15级物联网0班',3),
-> (null,'15级物联网1班',3),
-> (null,'15级物文传1班',4),
-> (null,'15级物文传2班',5);
mysql> select * from classes;
+----+-----------------------+-----------+
| id | name | teacherid |
+----+-----------------------+-----------+
| 1 | 15级计算机1班 | 1 |
| 2 | 15级计算机2班 | 1 |
| 3 | 15级计算机3班 | 1 |
| 4 | 15级计算机4班 | 1 |
| 5 | 15级信息管理1班 | 2 |
| 6 | 15级信息管理2班 | 2 |
| 7 | 15级信息管理3班 | 2 |
| 8 | 15级物联网0班 | 3 |
| 9 | 15级物联网1班 | 3 |
| 10 | 15级物文传1班 | 4 |
| 11 | 15级物文传2班 | 5 |
+----+-----------------------+-----------+
mysql> -- 现在我们将删除teacher 表中3号曹操老师
mysql> -- 看看classes表中会发生什么现象
mysql> delete from teacher where id=3;
mysql> select * from teacher;
+----+-----------+------+-------------+
| id | name | sex | phone |
+----+-----------+------+-------------+
| 1 | 关羽 | 男 | 18800000001 |
| 2 | 赵云 | 男 | 18800000002 |
| 4 | 小乔 | 女 | 18800000004 |
| 5 | 大乔 | 女 | 18800000005 |
| 6 | 孙尚香 | 女 | 18800000006 |
+----+-----------+------+-------------+
mysql> -- 3号曹操老师已经被删除了
mysql> -- 查看classes表吧
mysql> select * from classes;
+----+-----------------------+-----------+
| id | name | teacherid |
+----+-----------------------+-----------+
| 1 | 15级计算机1班 | 1 |
| 2 | 15级计算机2班 | 1 |
| 3 | 15级计算机3班 | 1 |
| 4 | 15级计算机4班 | 1 |
| 5 | 15级信息管理1班 | 2 |
| 6 | 15级信息管理2班 | 2 |
| 7 | 15级信息管理3班 | 2 |
| 10 | 15级物文传1班 | 4 |
| 11 | 15级物文传2班 | 5 |
+----+-----------------------+-----------+
mysql> -- 和上面的classes表对比,我们发现15级物联网0班和15级物联网1班的记录已经没有了
mysql> -- 我们再看看级联更新 update cascade
mysql> select * from teacher;
+----+-----------+------+-------------+
| id | name | sex | phone |
+----+-----------+------+-------------+
| 1 | 关羽 | 男 | 18800000001 |
| 2 | 赵云 | 男 | 18800000002 |
| 4 | 小乔 | 女 | 18800000004 |
| 5 | 大乔 | 女 | 18800000005 |
| 6 | 孙尚香 | 女 | 18800000006 |
+----+-----------+------+-------------+
5 rows in set (0.00 sec)
mysql> -- 我们将小乔的编号改为3号,看看classes表中15级物文传1班记录的teacherid的变化
mysql> update teacher set id=3 where name='小乔';
mysql> select * from teacher;
+----+-----------+------+-------------+
| id | name | sex | phone |
+----+-----------+------+-------------+
| 1 | 关羽 | 男 | 18800000001 |
| 2 | 赵云 | 男 | 18800000002 |
| 3 | 小乔 | 女 | 18800000004 |
| 5 | 大乔 | 女 | 18800000005 |
| 6 | 孙尚香 | 女 | 18800000006 |
+----+-----------+------+-------------+
5 rows in set (0.00 sec)
mysql> -- 已经更改了
mysql> -- 看看classes中的情况吧
mysql> select * from classes;
+----+-----------------------+-----------+
| id | name | teacherid |
+----+-----------------------+-----------+
| 1 | 15级计算机1班 | 1 |
| 2 | 15级计算机2班 | 1 |
| 3 | 15级计算机3班 | 1 |
| 4 | 15级计算机4班 | 1 |
| 5 | 15级信息管理1班 | 2 |
| 6 | 15级信息管理2班 | 2 |
| 7 | 15级信息管理3班 | 2 |
| 10 | 15级物文传1班 | 3 |
| 11 | 15级物文传2班 | 5 |
+----+-----------------------+-----------+
9 rows in set (0.00 sec)
mysql> -- 我们发现15级物文传1班的班主任编号变成了3
mysql> -- 当然我们在表classes中设置delete cascade 明显是不合理的如果
mysql> -- 老师的记录删除,我们可以认为老师退休了,或者老师调走了,但是
mysql> -- 班级依旧存在,不会因为老师的离开而不复存在,所以可以认为,老师
mysql> -- 调走了,班主任的位置就空置出来了,但是班级依旧存在
mysql> -- 因此我们可以更改classes中对teacherid外键限制的约束,这就用到了set null
mysql> -- 在此之前我们得先删除对teacherid的外键约束,但是我们的外键约束是在创建
mysql> -- 表的时候创建的,我们并不知道外键名 ,我们知道
mysql> -- 删除外键约束的命令格式是:删除外键约束:alter table 表名 drop foreign key 外键名(区分大小写);
mysql> -- 那怎么办呢
mysql> -- 可以用到一个命令 desc 表名; 用于查看表的创建过程的命令,可以查看外键名称
mysql> desc classes;
-- +-----------+-------------+------+-----+---------+----------------+
-- | Field | Type | Null | Key | Default | Extra |
-- +-----------+-------------+------+-----+---------+----------------+
-- | id | int(11) | NO | PRI | NULL | auto_increment |
-- | name | varchar(20) | YES | | NULL | |
-- | teacherid | int(11) | YES | MUL | NULL | |
-- +-----------+-------------+------+-----+---------+----------------+
-- 3 rows in set (0.00 sec)
mysql> -- 呃呃 记错了,desc 表名是查看表结构的,哈,不过没有关系突然想起来了
mysql>
mysql> -- show creat table 表名;
mysql> show create table classes;
-- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | Table | Create Table |
-- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | classes | CREATE TABLE `classes` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `name` varchar(20) DEFAULT NULL,
-- `teacherid` int(11) DEFAULT NULL,
-- PRIMARY KEY (`id`),
-- KEY `teacherid` (`teacherid`),
-- CONSTRAINT `classes_ibfk_1` FOREIGN KEY (`teacherid`) REFERENCES `teacher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
-- ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 |
-- +---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- 1 row in set (0.00 sec)
mysql> -- 哈找到了 `classes_ibfk_1` 不就是么,开始我们的删除之旅吧
mysql> alter table classes drop foreign key `classes_ibfk_1`;
-- Query OK, 0 rows affected (0.04 sec)
-- Records: 0 Duplicates: 0 Warnings: 0
mysql> -- OK;
mysql> show create table classes;
-- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | Table | Create Table |
-- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | classes | CREATE TABLE `classes` (
-- `id` int(11) NOT NULL AUTO_INCREMENT,
-- `name` varchar(20) DEFAULT NULL,
-- `teacherid` int(11) DEFAULT NULL,
-- PRIMARY KEY (`id`),
-- KEY `teacherid` (`teacherid`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 |
-- +---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- 1 row in set (0.00 sec)
mysql> -- 接下来我们重新添加对teacherid的外键约束
mysql> alter table classes add constraint `fk_TeacherClasses`
foreign key classes(teacherid) references teacher(id)
on delete set null on update cascade;
-- Query OK, 9 rows affected (0.13 sec)
-- Records: 9 Duplicates: 0 Warnings: 0
mysql> -- 接下来我们就来验证以下set null 吧
mysql> select * from teacher;
-- +----+-----------+------+-------------+
-- | id | name | sex | phone |
-- +----+-----------+------+-------------+
-- | 1 | 关羽 | 男 | 18800000001 |
-- | 2 | 赵云 | 男 | 18800000002 |
-- | 3 | 小乔 | 女 | 18800000004 |
-- | 5 | 大乔 | 女 | 18800000005 |
-- | 6 | 孙尚香 | 女 | 18800000006 |
-- +----+-----------+------+-------------+
-- 5 rows in set (0.00 sec)
mysql> select * from classes;
-- +----+-----------------------+-----------+
-- | id | name | teacherid |
-- +----+-----------------------+-----------+
-- | 1 | 15级计算机1班 | 1 |
-- | 2 | 15级计算机2班 | 1 |
-- | 3 | 15级计算机3班 | 1 |
-- | 4 | 15级计算机4班 | 1 |
-- | 5 | 15级信息管理1班 | 2 |
-- | 6 | 15级信息管理2班 | 2 |
-- | 7 | 15级信息管理3班 | 2 |
-- | 10 | 15级物文传1班 | 3 |
-- | 11 | 15级物文传2班 | 5 |
-- +----+-----------------------+-----------+
-- 9 rows in set (0.00 sec)
mysql> -- 我们将teacher表中的小乔删除
mysql> delete from teacher where name='小乔';
-- Query OK, 1 row affected (0.01 sec)
mysql> select * from teacher;
-- +----+-----------+------+-------------+
-- | id | name | sex | phone |
-- +----+-----------+------+-------------+
-- | 1 | 关羽 | 男 | 18800000001 |
-- | 2 | 赵云 | 男 | 18800000002 |
-- | 5 | 大乔 | 女 | 18800000005 |
-- | 6 | 孙尚香 | 女 | 18800000006 |
-- +----+-----------+------+-------------+
-- 4 rows in set (0.00 sec)
mysql> select * from classes;
-- +----+-----------------------+-----------+
-- | id | name | teacherid |
-- +----+-----------------------+-----------+
-- | 1 | 15级计算机1班 | 1 |
-- | 2 | 15级计算机2班 | 1 |
-- | 3 | 15级计算机3班 | 1 |
-- | 4 | 15级计算机4班 | 1 |
-- | 5 | 15级信息管理1班 | 2 |
-- | 6 | 15级信息管理2班 | 2 |
-- | 7 | 15级信息管理3班 | 2 |
-- | 10 | 15级物文传1班 | NULL |
-- | 11 | 15级物文传2班 | 5 |
-- +----+-----------------------+-----------+
-- 9 rows in set (0.00 sec)
mysql> -- 我们发现15级物文传1班 的teacherid已经为空了
总结:
添加外键:
创建表时:
foreign key(字段名) references
父表(字段名) [on delete cascade on update cascade];
constraint `约束名` foreign key(字段名)
references 父表名(字段名));
创建表之后:
alter table 子表名 add [constraint [`约束名`]]
foreign key (字段名) references
父表名(字段名) [on delete [...] on update[...]];
alter table 子表名 add [constrint [`约束名`]]
foreign key 子表名(字段名) references
父表名(字段名) [on delete [...] on update[...]];
删除外键:
alter table 表名 drop foreign key `约束名`;
- 3)唯一约束 UNIQUE:
添加非空约束:
在创建表的时候:
mysql> create table temp(
-> id int primary key auto_increment,
-> name varchar(20) unique, -- 在创建表的时候创建唯一约束
-> otherid int);
Query OK, 0 rows affected (0.14 sec)
mysql> create table temp(
-> id int,
-> name varchar(20),
-> unique key(id,name) -- 联合约束
-> );
Query OK, 0 rows affected (0.08 sec)
其他时候:
通过更改 字段属性
ALTER TABLE t_user MODIFY user_id INT(10) UNIQUE;
通过更改 字段名及属性
ALTER TABLE t_user CHANGE user_id user_id INT(10) UNIQUE;
添加约束
ALTER TABLE t_user ADD UNIQUE(user_id);
ALTER TABLE t_user ADD UNIQUE KEY(user_id);
ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE(user_id);
ALTER TABLE t_user ADD CONSTRAINT UN_ID UNIQUE KEY(user_id);
删除非空约束:
ALTER TABLE t_user DROP INDEX user_id;
如果是联合约束,删除一个相当于将两个都删除了
- 4)ZEROFILL(零填充)
添加零填充
1)在创建表的时候添加
CREATE TABLE t_user(user_id INT(10) ZEROFILL);
2)通过ALTER语句
ALTER TABLE t_user MODIFY user_id INT(10) ZEROFILL;
ALTER TABLE t_user CHANGE user_id user_id INT(10) ZEROFILL;
删除零填充
ALTER TABLE t_user MODIFY user_id INT(10);
ALTER TABLE t_user CHANGE user_id user_id INT(10);
注:零填充会将未将有效位以外的位用零来显示,比如某字段数据类型为INT(5),
而插入的值为2,那么零填充会显示00002
但是,这个效果在Navicat for MySQL中显示不出来,只有在DOS窗口下才能显示
- 5)UNSIGNED(无符号位)
添加无符号
1)在创建表的时候添加
CREATE TABLE t_user(user_id INT(10) UNSIGNED);
2)通过ALTER语句
ALTER TABLE t_user MODIFY user_id INT(10) UNSIGNED;
ALTER TABLE t_user CHANGE user_id user_id INT(10) UNSIGNED;
删除无符号
ALTER TABLE t_user MODIFY user_id INT(10);
ALTER TABLE t_user CHANGE user_id user_id INT(10);
注:无符号作用于数值类型
- 6)DEFAULT(默认)
添加默认约束
1)在创建表的时候添加
CREATE TABLE t_user(user_id INT(10) DEFAULT 3);
2)通过ALTER语句
ALTER TABLE t_user MODIFY user_id INT(10) DEFAULT 2;
ALTER TABLE t_user CHANGE user_id user_id INT(10) DEFAULT 2;
删除默认约束
ALTER TABLE t_user MODIFY user_id INT(10);
ALTER TABLE t_user CHANGE user_id user_id INT(10);
- 7)AUTO_INCREMENT(自增长)
添加自增长
1)在创建表的时候添加
CREATE TABLE t_user(user_id INT(10) AUTO_INCREMENT PRIMARY KEY);
2)通过ALTER语句
ALTER TABLE t_user MODIFY user_id INT(10) AUTO_INCREMENT;
ALTER TABLE t_user CHANGE user_id user_id INT(10) AUTO_INCREMENT;
删除自增长
ALTER TABLE t_user MODIFY user_id INT(10);
ALTER TABLE t_user CHANGE user_id user_id INT(10);
注:There can be only one auto column and it must be defined as a key.
一张表只能有一个自增长列,并且该列必须定义了约束(可以是主键约束,也可以
是唯一约束,也可以是外键约束,但是不可以是非空和检查约束)
不过自增长一般配合主键使用,并且只能在数字类型中使用
- 8)非空约束NOT NULL
添加非空约束
1)建表时直接添加
CREATE TABLE t_user(user_id INT(10) NOT NULL);
2)通过ALTER 语句
ALTER TABLE t_user MODIFY user_id INT(10) NOT NULL;
ALTER TABLE t_user CHANGE user_id user_id INT(10) NOT NULL;
删除非空约束
1)ALTER TABLE t_user MODIFY user_id INT(10);
2)ALTER TABLE t_user CHANGE user_id user_id INT(10);
注意:非空约束NOT NULL,自增长约束AUTO_INCREMENT,默认约束DEFAULT,无符号为约束UNSIGNED,
零填充约束ZEROFILL的添加约束,删除约束的格式都一致
唯一约束unique和他们略有不同,添加约束的时候还可以设置联合约束,
删除约束的时候通过 alter table 表名 drop index 字段名;删除,通过
alter table modify/chang 字段名,字段属性 约束 ;无法删除unique约束
所以可以看出唯一约束,主键约束,外键约束是可以是表级的约束
而其他5中约束只能是列级别的约束
从查询information_schema中查询指定表中的约束
USE INFORMATION_SCHEMA;
SELECT CONSTRAINT_NAME FROM TABLE_CONSTRAINTS WHERE TABLE_NAME='student';
11、更改表结构:以student表为例
为表添加字段: 关键字 alter,add alter table student add id int(10) primary key;--为student 表 添加id字段并设为主键 更改字段属性:关键字 alter,modify alter table student modify age int(10) not null; 更改字段名: 关键字 alter,chang alter table student chang name username varchar(20);--将student name字段更名为username
12、控制台插入中文字符乱码,报错 set names gbk;
13、数据库备份:
mysqldump -u root -p 数据库名
14、聚集函数:
sum(),avg(),count(),max(),min() where 子句后面的条件不能是聚集函数
15、分组:
group by : group by 子句应该放在 having子句之前 where子句之后
16、order by 字句:
order by 字段名 (desc/asc);
17、关系运算:
>: <: <>: =: between ...and ... in(..,..,...,..)
18、字符匹配:
%:匹配0个或者多个字符 _: 匹配1个字符 字符匹配一般配合着like 子句使用
19、了解什么是范式并且能够根据范式设计表格