一、约束条件
1、常用的约束条件:
mysql> create table school.restrict( //在school数据库创建restrict表
->name char(5) not null, //字段名 类型(范围) 约束条件为不允许为空
->gender enum("male","female") not null default "male", //不允许为空且默认值为male
->age int(3) not null default 21, //不允许为空且默认值为21
->interest set("book","movie","eat"));
mysql> insert into school.restrict(name) values ("tom"); //仅插入姓名可以成功
注意:一但字段名为不允许为空且默认值已设定,就不能再插入数据了。
如:
mysql> insert into school.restrict(age) values (11); //name 不可以为空
报错信息:ERROR 1364 (HY000): Field ‘name’ doesn’t have a default value
二、修改表结构
基本用法:alter table 表名 执行动作;
1、add添加字段
格式:alter table 表名 add 字段名称 类型(宽度) 约束条件;
mysql> alter table school.restrict add email varchar(30); //默认添加的字段在表的最后,所有已经添加的数据,email 列都是 NULL。
mysql> alter table school.restrict add phone varchar(30) not null after name; //添加字段phone,放到namea字段的后面。
mysql> alter table school.restrict add addr varchar(30) not null default "beijing" frst; //添加新字段addr,放到所有字段前面。
2、modify修改字段
格式:alter 表名 modify 字段名称 类型(宽度) 约束条件;
mysql> alter school.restrict modify addr varchar(50) default 'shanghai' after name;
//修改 addr 字段的类型长度为 50,修改默认值为’shanghai’,将 addr 调整到 name 字段的后面。
-
chage 修改字段名称
格式:alter table 表名 change 字段名称 类型(宽度) 约束条件;mysql> alter table school.restrict change name myname varchar(10);
//把数据表中的 name 字段重命名为 myname,同时修改了数据类型的长度。
4、drop 修改字段名称
格式:alter table 表名 drop 字段名称
mysql> alter table school.restrict drop interest; //删除数据表中的 interest 字段。
- rename 修改字段名称
格式:alter table 表名 rename 新的数据表名称
mysql> alter table school.restrict rename school.rest;
mysql> use school;
mysql> show tables;
三、mysql键值
什么是索引:就是对数据表中的若干字段进行排序的方法,类似于对一本书做目录,有了目录就可以快速定位数据
的具体位置。
索引的优点:
◼ 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
◼ 可以加快数据的检索速度
索引的缺点:
◼ 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低数据库的写速度
◼ 索引需要占额外的物理空间
-
INDEX 普通索引
使用说明
⚫ 一个表中可以有多个 INDEX 字段
⚫ 字段的值允许有重复,切可以赋 NULL 值
⚫ 经常把做查询条件的字段设置为 INDEX 字段
⚫ INDEX 字段的 KEY 标志是 MULmysql> create table school.info(
id int(6) not null,
name varchar(5),
sex enum(‘male’,‘female’),
age int(3) default 1,
index(id),index(name)); //将id,name作为普通索引
在已有的数据表中创建或删除索引。
1.创建索引: create index 索引名称 on 数据表(字段名称)
mysql> create index age on school.info(age);
mysql> create index nianling on school.info(age);
提示:可以创建多个索引,索引与字段名称也可以不一样。
2.删除索引:
格式:drop index 索引名称 on 数据表
mysql> drop index name on school.info;
查看索引信息:
mysql> show index from school.info\G; //以列查看索引信息
-
primary key 主键索引
注意事项:
⚫ 一个表中只能有一个 primary key 字段
⚫ 对应的字段值不允许有重复,且不允许赋 NULL 值
⚫ 如果有多个字段都作为 PRIMARY KEY,称为复合主键,必须一起创建。
⚫ 主键字段的 KEY 标志是 PRI
⚫ 通常与 AUTO_INCREMENT 连用
⚫ 经常把表中能够唯一标识记录的字段设置为主键字段[记录编号字段]mysql> create table school.student(
stu_id char(9),
name
char(5),
primary key(stu_id));
提示:stu_id 字段自动被设置为不能为 Null,Key 下面有 Pri 标记(主键标记).
mysql> insert into school.student values (‘NSD181001’,‘小帕克’);
创建主键索引的另一种方式:
mysql> create table school.student2(
id char(9) primary key,
name char(5));
对已经存在的数据表创建主键索引
语法: alter table 数据表名称 add primary key(字段名称);
mysql> create table school.student3(
id char(9),
name char(5));
mysql> alter table school.student3 add primary key(id);
提示:在已经存在的表中创建主键索引,一定要确保做为主键的字段数据中没有 null 的值。
如果确实已经有 null 值了,可以 delete 删除数据或者 update 更新数据为非 null。
删除数据表中的主键索引
mysql> alter table school.student3 drop primary key;
//提示:删除主键后,对应的字段数据就可以出现重复的数据了
复合主键索引(多个字段做主键)
不做主键(可能同一个人技能不同)
姓名 单位 技能
孙悟空 西游记 100
孙悟空 西游记 80
以姓名为主键(不同书中的任务技能水平不同,名称相同时无法写入,因为姓名不能重复)
姓名 单位 技能
孙悟空 西游记 100
孙悟空 沉香救母 80
mysql> insert into school.book values ('孙悟空','西游记',100);
mysql> insert into school.book values ('孙悟空','沉香救母',80); //提示:单独的姓名重复是可以的
mysql> insert into school.book values ('孙悟空','沉香救母',100); //提示:姓名和单位都重复会报错。
自动添加属性(可以自动将数据自动加 1)
mysql> create table school.demo(
id int(100) auto_increment primary key,
name char(10));
mysql> insert into school.demo(name) values ('tom');
mysql> insert into school.demo(name) values ('jerry');
select * from school.demo;
提示:id 自动不写,默认也会自动加 1.
提示:当同时有自增长和主键时,一定要通过 alter 将自增长删除后才可以删除主键,无法直接删除主键。
- foreign key 外键
一个作者信息表
一个图书信息表
要求图书表中的图书作者必须是作者表中的作者。
什么是外键?
让当前表字段的值在另一个表中某个字段值的范围内选择。
使用外键的条件:
表存储引擎必须是 innodb(默认就是)
字段类型必须一致
被参照字段必须是索引类型中的一种(primary key)
创建外键的语法:
foreign key(表 B 的字段名称)references 表 A(字段名称)
on update casecade //同步更新
on delete casecade //同步删除
创建数据库:
mysql> create database press character set utf8;
创建包含主键的数据表(作者信息表):
mysql> create table press.author(
姓名 char(10) primary key,
地址 char(10));
往作者信息表中插入数据:
mysql> insert into press.author values
('施耐庵','苏州'),
('曹雪芹','辽宁'),
('罗贯中','山西');
创建图书信息表并创建外键:
mysql> create table press.book(
书名 char(20),
作者 char(10),
foreign key(作者) references press.author(姓名)
on update cascade on delete cascade);
mysql> insert into press.book values ('红楼','无');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`press`.`book`, CONSTRAINT
`book_ibfk_1` FOREIGN KEY (`作者`) REFERENCES `author` (`姓名`) ON DELETE CASCADE ON UPDATE CASCADE) //当作者不在 author 表中就报错
mysql> insert into press.book values ('红楼','曹雪芹');
Query OK, 1 row affected (0.21 sec)
mysql> delete from press.author where 姓名='曹雪芹';
Query OK, 1 row affected (0.03 sec)
#提示:当作者表中的作者被删除后,图书信息表中对应的数据也会被删除。
删除外键,需要先查看外键的名称:
mysql> show create table press.book\G;
删除外键:
mysql> alter table press.book drop foreign key book_ibfk_1;
mysql> drop table press.book;
在现有的数据表中创建外键:
mysql> create table press.book(
书名 char(20),
作者 char(10));
mysql> alter table press.book
add
foreign key(作者) references press.author(姓名)
on update cascade on delete cascade;