1. 创建表
创建表:
- create table t1 (id int,name char(4));
- create table t2 (id int,name char(4)) engine=myisam; # 使用MyISAM存储引擎
- create table t3 (id int,name char(4)) engine=memory; # 使用MEMORY存储引擎
查看表的结构:
show create table 表名; — 能够看到和这张表相关的所有信息
desc 表名; — 只能查看表的字段的基础信息
desc 表名; = describe 表名;
2. 表的约束
1.unsigned
- unsigned —— 设置某一个数字无字符
2.not null
not null —— 某一个字段不能为空
严格模式会影响非空设置的效果
3.default
default 给某个字段设置默认值
create table t2( id int not null, name char(12) not null, age int default 18, # 设置默认值为18,但不会自动填充 gender enum('male','female') not null default 'male' # 不填充gender的值时,会自动默认填充'male' )
4.unique
unique 设置某一个字段不能重复
create table t3( id int unique, username char(12) unique, password char(18) );
联合唯一
需要联合的两个字段都不唯一,但是两个字段联合在一起时就要是唯一的。
将需要联合的两个字段写道unique()里 —— unique(字段名1,字段名2)
create table t4( id int, ip char(15), server char(10), port int, unique(ip,port) );
5.auto_increment
auto_increment 设置某一个int类型的字段 自动增加
字段设置条件 :必须是数字 且 必须是唯一的 —— int + unique
auto_increment自带非空not null 、自增的效果
create table t5(
id int unique auto_increment,
username char(10),
password char(18)
)
insert into t5(username,password) values('alex','alex3714') # id字段设置为自增字段,增加数据时不输入id字段的值,它会自动增加
6.primary key 主键
primary key 设置某一个字段非空且不能重复
约束这个字段 :非空(not null) 且 唯一(unique) 相当于 not null + unique
一张表只能设置一个主键
一张表可以没有主键,但最好设置一个主键(这已变成一条规范)
create table t6(
id int not null unique, # 你指定的第一个非空且唯一的字段会被定义成主键
name char(12) not null unique
)
create table t7(
id int primary key, # 主键
name char(12) not null unique
)
联合主键(不常用)
联合主键:设置每一个字段不能为空,并且这两个字段联合起来成为不能重复的主键的元素
create table t4( id int, ip char(15), server char(10), port int, primary key(ip,port) );
7.foreign key 外键 涉及到两张表
references
外键关联的字段至少必须是唯一unique的,所以会直接将被关联的这个字段设置成主键。
先创建被关联的外表,再创建本表。
部门表 : pid postname post_comment post_phone
create table post(
pid int primary key,
postname char(10) not null unique,
comment varchar(255),
phone_num char(11)
)
员工表
create table staff(
id int primary key auto_increment,
age int,
gender enum('male','female'),
salary float(8,2),
hire_date date,
post_id int,
foreign key(post_id) references post(pid)
)
insert into post / staff values …………
update post set pid=2 where pid = 1;
delete from post where pid = 1;
级联删除和级联更新:
create table staff2(
id int primary key auto_increment,
age int,
gender enum('male','female'),
salary float(8,2),
hire_date date,
post_id int,
foreign key(post_id) references post(pid) on update cascade on delete cascade
)
如果级联删除外表中关联的数据后,让本表中被关联的外键列数据仍然存在,需要将外键列设置为空null :
- on delete cascade 写成 on delete set null
create table staff2(
id int primary key auto_increment,
age int,
gender enum('male','female'),
salary float(8,2),
hire_date date,
post_id int,
foreign key(post_id) references post(pid) on update cascade on delete set null
)
on delete:
cascade方式:
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
set null方式:
在父表上update/delete记录时,将子表上匹配记录的列设为null
注意:子表的外键列不能为not null
3. 修改表
1.什么时候会用到修改表?(一般不会常见)
- 创建项目之前已创建了表
- 项目开发、运行过程中
2.修改表语句
alter table 表名 add —— 添加字段
- alter table 表名 add 字段名 数据类型(宽度) 约束 first/after name
alter table 表名 drop —— 删除字段
- alter table 表名 drop 字段名;
alter table 表名 modify —— 修改已经存在的字段 的类型 宽度 约束
- alter table 表名 modify name(字段名后面是修改的内容) varchar(12) not null
id name age
alter table 表名 modify age int not null after id; # 将age的位置修改到id后面
alter table 表名 modify age int not null fir