MySQL数据库简介
数据库控制
命令行操作数据库
mysql -u root -p123456
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
flush privileges;
show tables;
describe 表名;
exit;
show 命令
show databases;
show tables或show tables from database_name;
show table status;
show columns from database_name.table_name;
desc 表名
show index from table_name;
show grants for user_name;
show status;
show variables;
show processlist;
show privileges;
show create database database_name;
show create table table_name;
show logs;
show warnings;
show errors;
show [storage] engines;
show character set;
show innodb status;
数据库表的列类型
数值类型
int(M) :M指示最大显示宽度。显示宽度与存储大小或类似所包含值的范 围无关
字符串类型
日期和时间型类型
NULL值
- 理解为 “没有值” 或 “未知值”
- 不要用NULL进行算术运算 , 结果仍为NULL
数据库表的字段属性
UnSigned
ZEROFILL
- 0填充的
- 不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement
NULL 和 NOT NULL
- 默认为NULL , 即该列允许为空
- 如果设置为NOT NULL , 则该列必须有值
DEFAULT
- 用于设置默认值
- 例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
拓展:阿里云项目数据库规范
每一个表都要有这几个字段
id 主键
version 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
数据库表的引擎
默认使用 INNODB
功能 | InnoDB | MYISAM | Memory | Archive |
---|
存储限制 | 64TB | 256TB | RAM | None | 支持事务 | Y | N | N | N | 支持全文索引 | N | Y | N | | 支持哈希索引 | N | N | Y | N | 支持数据缓存 | Y | N | N/A | N | 支持外键 | Y | N | N | N |
- 选择策略:
- 如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
- 如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
- 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎
- MySQL中使用该引擎作为临时表,存放查询的中间结果
- 如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。
- Archive非常适合存储归档数据,如记录日志信息可以使用Archive
数据库表的在物理空间的位置
数据库表的字符集
我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :
-
创建时通过命令来设置 , 如 : CREATE TABLE 表名()CHARSET = utf8; -
如无设定 , 则根据MySQL数据库配置文件my.ini 中的参数设定 character-set-server=utf8
不建修改配置文件,这样会导致sql语句的移植性降低
数据库表的外键(了解)
概念
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。
由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
引用别人的表——主表;
被别人引用的表——从表;
作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据约束,使两张表形成关联。
主表中的外键只能引用外表中的对应列的值或使用空值。
MySQL命令操作
-
创建外键
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
-
删除外键 -- 删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
-- 发现执行完上面的,索引还在,所以还要删除索引
-- 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX FK_gradeid;
- 删除具有主外键关系的表时 , 要先删子表 , 后删主表
以上操作都是物理外键、数据库级别的外键,不建议使用
- 原因:对于数据库的所有外键的每次插入、更新和删除后,数据库服务器进行完整性检查是一个耗费时间和资源的过程,它可能影响性能
最佳实践
- 数据库就是单纯的表,只用来存数据,只有行、列
- 我们想使用多张表,想使用外键,可以使用程序实现(联合查询)
|