1 创建数据库
create databases;
2 进入数据库
use databases;
3 创建表
create table student(id int auto_increment primary key,name varcher not null,gender int not null,grade int)default charset=utf8;
4 查看表
show tables;
4 插入数据
insert into student(name,gender,grade)values('zhangsan',1,1);
5 查看插入的数据
select * from student;
6 创建主键,外键
(1)创建表时注明,可以在字段后标注,如
可以在表最后标注,如
foreign key(studentid)references student(id),
primary key (id),
注意,studentid 是之前表结构中有的,在这里设置为外键
(2)创建表后添加,这里也是之前表中有该列,这里设置为外键
alter table course add foreign key (studentid) references student(id);
或者
alter table course add constraint 外键名 foreign key (teacherid) references teacher(id);
注:
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
RESTRICT 限制外表外键改变
CASCADE 级联改变
SET NULL 设为null值
NO ACTION 无动作
SET DEFAULT 设为默认值
添加违反外键的记录时报错
修改主表主键值时报错,因为默认是RESTRICT,限制其修改
修改外键约束
alter table course drop foreign key teacher_id,add constraint teacherid foreign key (teacher_id) references teacher (id) on update cascade on delete cascade;
外键主要是保证数据一致性与完整性,减少数据冗余
其一,阻止执行:从表插入/修改外键值,不在主表主键值就阻止更改,主表删除/修改主键值,关联到从表就阻止(除非先修改从表记录)
其二,级联执行:主表删除行,关联从表相关行一起删除;主表修改主键值,关联从表相关行一起修改
外键约束 restrict
将restrict改为cascade后
设置外键时注意主表必须有主键,外键中列的数目与父表中主键列数目相同(多个键联合做主键),数据类型相似(比如int 与 tiny int)
7 查看表结构/更改
show create table ...;
alter table course2 add column description varchar(255);
8 新增记录
insert into course2 set name='';
8 更新,删除记录
update student set name =‘张三’where id = 1;
update course2 c2 left join course c1 on c2.name=c1.name set c2.description=c1.description where c1.name=c2.name;
update course2 set description = 'good' where description like '%d';
delete from student where id = 1;
delete from student order by gender desc limit 2;
9 查找记录
select * from student;
select name from student where id = 1;
select c.name,t.name from course c,teacher t where c.teacher_id=t.id;
select * from student limit 2; 查找前两个记录 注意mysql里没有top,用limit
select name studentname from student;、
select * from course2 c2 inner join course c1 where c1.id = c2.id;
select * from course2 c2 left join course c1 on c1.name=c2.name;(显示c2表的完整内容,c1匹配的记录显示,否则显示为null)
select name from course2 union select name from course;