前言:
本文内容:MyISAM和InnoDB的区别、修改和删除数据表字段、数据库级别的外键
推荐免费MySQL基础讲解视频:【狂神说Java】MySQL最新教程通俗易懂_哔哩哔哩_bilibili
MyISAM和InnoDB的区别
功能
MyISAM
InnoDB(默认)
事务支持
不支持
支持
数据行锁定
不支持
支持
外键约束
不支持
支持
全文索引
支持
不支持
表空间大小
较小
较大(前者的2倍)
常规使用操作
MyISAM 节约空间 速度较快;
InnoDB 安全性高,事务的处理,多表多用户操作
在物理空间存在的位置
所有数据文件都在data目录下,一个文件夹对应一个数据库,本质还是文件的存储。
MySQL引擎在物理文件上的区别:
InnoDB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
MyISAM对应文件
*.frm 表结构定义文件
*.myd 数据文件(data)
*.myi 索引文件(index)
设置数据库的字符集编码
不设置的话,回事mysql默认的字符集编码(不支持中文)
在my.ini中配置默认的编码
1 character - set - server= utf8
修改和删除数据表字段
修改
1 2 3 4 5 6 7 8 9 10 alter table student rename as students;alter table students add age int (11 );alter table students modify age varchar (10 );alter table students change age age1 int (11 );alter table students drop age1;
删除
1 2 drop table if exists students;
注意点:
字段名使用``
包裹
注释 -- 和 /**/
sql关键字大小写不敏感
数据库级别的外键
简介
外键表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL能够保持参照完整性。
创建外键
方式一:在创建表时,增加约束(较麻烦);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 create table `grade`( `gradeid` int not null auto_increment comment '年级id' , `gradename` varchar (20 ) not null comment '年级名称' , primary key(`gradeid`) )engine= innodb charset= utf8 CREATE TABLE `student` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '学号' , `name` varchar (20 ) NOT NULL DEFAULT '佚名' COMMENT '姓名' , `pwd` varchar (20 ) NOT NULL DEFAULT '123456' COMMENT '密码' , `sex` varchar (2 ) NOT NULL DEFAULT '男' COMMENT '性别' , `birthday` datetime DEFAULT NULL COMMENT '出生年月' , `address` varchar (100 ) DEFAULT NULL COMMENT '地址' , `email` varchar (50 ) DEFAULT NULL COMMENT '邮箱' , `gradeid` int not null comment '年级id' , PRIMARY KEY (`id`), key `fk_gradeid`(`gradeid`), constraint `fk_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`) ) ENGINE= InnoDB DEFAULT CHARSET= utf8 select * from grade gr,student st where gr.gradeid= st.gradeid;
注意:删除有外键关系的表时,必须要先删除引用的表,再删除被引用的表;
方式二:创建表成功后,添加外键约束;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 create table `grade`( `gradeid` int not null auto_increment comment '年级id' , `gradename` varchar (20 ) not null comment '年级名称' , primary key(`gradeid`) )engine= innodb charset= utf8 CREATE TABLE `student` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '学号' , `name` varchar (20 ) NOT NULL DEFAULT '佚名' COMMENT '姓名' , `pwd` varchar (20 ) NOT NULL DEFAULT '123456' COMMENT '密码' , `sex` varchar (2 ) NOT NULL DEFAULT '男' COMMENT '性别' , `birthday` datetime DEFAULT NULL COMMENT '出生年月' , `address` varchar (100 ) DEFAULT NULL COMMENT '地址' , `email` varchar (50 ) DEFAULT NULL COMMENT '邮箱' , `gradeid` int not null comment '年级id' , PRIMARY KEY (`id`) ) ENGINE= InnoDB DEFAULT CHARSET= utf8 alter table `student`add constraint `fk_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`);select * from grade gr,student st where gr.gradeid= st.gradeid;
以上两种添加外键的方式都是物理外键,数据库级别的外键,并不建议使用!(避免数据库过多造成困扰)
最佳实现
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段);
要想使用多张表的数据,想使用外键(可用程序区实现);