-- 创建表
/*
语法格式:
create table tableName(
columnName dataType(length),
………………..
columnName dataType(length)
);
set character_set_results='gbk';
创建表的时候,表中有字段,每一个字段有:
* 字段名
* 字段数据类型
* 字段长度限制
* 字段约束
*/
-- 建立学生信息表,字段包括:学号、姓名、性别、出生日期、email、班级标识
drop table if exists t_student;
create table t_student(
student_id int(10),
student_name varchar(20),
sex char(2),
birthday date,
email varchar(30),
class_id int(3)
)
desc t_student;-- 逆序显示表结构
insert into t_student(student_id,student_name,sex,birthday,email,class_id)values(1001,'zhangsan','m','1988-01-01','[email protected]',10)
-- 添加、删除、修改表结构
alter table t_student add contact_tel varchar(40);
alter table t_student modify student_name varchar(100);
alter table t_student change sex gender char(2) not null;
alter table t_student drop contact_tel;
-- 添加、修改、删除
insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (9999,'zhangsan','MANAGER', null, null,3000, 500, 10);
-- 如何插入日期
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9997,'zhangsan','MANAGER', null, '1981-06-12',3000, 500, 10);
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9996,'zhangsan','MANAGER',null,str_to_date('1981-06-12','%Y-%m-%d'),3000, 500, 10);
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9995,'zhangsan','MANAGER',null,now() ,3000, 500, 10);
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9998,'zhangsan','MANAGER',null, now(),3000, 500, 10);
-- 创建表
create table emp_bak as select empno,ename,sal from emp;
desc emp_bak;
insert into emp_bak select empno,ename,sal from emp where sal=3000;-- 查询结果放到已存在的表中
/*update语法:update 表名 set 字段名称1=需要修改的值1, 字段名称2=需要修改的值2 where ……. */
update emp set sal=sal+sal*0.1 where job='MANAGER';
delete from emp where comm=500;
-- 创建表加入约束
/* 常见的约束
a) 非空约束,not null
b) 唯一约束,unique
c) 主键约束,primary key
d) 外键约束,foreign key
e) 自定义检查约束,check(不建议使用)(在mysql中现在还不支持)
*/
drop table if exists t_classes;
create table t_classes(
classes_id int (3),
classes_name varchar(30) not null,
constraint pk_classes_id primary key(classes_id)
)
drop table if exists t_student;
create table t_student(
student_id int(10),
student_name varchar(50) not null,/*非空约束*/
sex char(2) not null,
birthday date not null,
email varchar(30) unique,/*唯一约束*/
classes_id int (3) not null,
constraint pk_student_id primary key(student_id),/*主键约束,表级约束*/
constraint fk_classes_id foreign key(classes_id) references t_classes(classes_id) /*外键约束、表级约束,存在外键的表就是子表,参照的表就是父表,所以存在一个父子关系,也就是主从关系,主表就是班级表,从表就是学生表 */
)
use information_schema;
select * from table_constraints where table_name = 't_student';-- 关于约束名称可以到table_constraints中查询
-- 向t_student中加入数据
use offer;
insert into t_student(student_id, student_name, sex, birthday, email, classes_id) values(1001, 'zhangsan', 'm', '1988-01-01', '[email protected]', 10)
/*1452 - Cannot add or update a child row: a foreign key constraint fails (`offer`.`t_student`, CONSTRAINT `fk_classes_id` FOREIGN KEY (`classes_id`) REFERENCES `t_classes` (`classes_id`))
出现错误,因为在班级表中不存在班级编号为10班级,外键约束起到了作用
存在外键的表就是子表,参照的表就是父表,所以存在一个父子关系,也就是主从关系,主表就是班级表,从表就是学生表
*/
insert into t_student(student_id, student_name, sex, birthday, email, classes_id) values(1001, 'zhangsan', 'm', '1988-01-01', '[email protected]', null)
/* Column 'classes_id' cannot be null*/
-- 添加数据到班级表,添加数据到学生表,删除班级数据,
insert into t_classes (classes_id,classes_name) values (10,'366');
insert into t_student(student_id, student_name, sex, birthday, email, classes_id)
values(1001, 'zhangsan', 'm', '1988-01-01', '[email protected]', 10)
update t_classes set classes_id = 20 where classes_name = '366';
/*1451 - Cannot delete or update a parent row: a foreign key constraint fails (`offer`.`t_student`, CONSTRAINT `fk_classes_id` FOREIGN KEY (`classes_id`) REFERENCES `t_classes` (`classes_id`))
因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除子表中的引用记录,再修改父表中的数据。
我们也可以采取以下措施 级联更新。
*/
delete from t_classes where classes_id = 10;
/*
1451 - Cannot delete or update a parent row: a foreign key constraint fails (`offer`.`t_student`, CONSTRAINT `fk_classes_id` FOREIGN KEY (`classes_id`) REFERENCES `t_classes` (`classes_id`))
因为子表(t_student)存在一个外键classes_id,它参照了父表(t_classes)中的主键,所以先删除父表,那么将会影响子表的参照完整性,所以正确的做法是,先删除子表中的数据,再删除父表中的数据,采用drop table也不行,必须先drop子表,再drop父表
我们也可以采取以下措施 级联删除。
*/
-- 级联更新与级联删除
-- on update cascade
/* mysql对有些约束的修改比较麻烦,所以我们可以先删除,再添加*/
alter table t_student drop foreign key fk_classes_id;
alter table t_student add constraint fk_classes_id_1 foreign key(classes_id) references t_classes(classes_id) on update cascade;
update t_classes set classes_id =20 where classes_name='366';/*只修改了父表中的数据,但是子表中的数据也会跟着变动*/
-- on delete cascade
/* mysql对有些约束的修改时不支持的,所以我么可以先删除,再添加*/
alter table t_student drop foreign key fk_classes_id_1;
alter table t_student add constraint fk_classes_id_2 foreign key(classes_id) references t_classes(classes_id) on delete cascade;
delete from t_classes where classes_id = 20;/*只删除了父表中的数据,但是子表也会中的数据也会删除*/
-- 增加、删除、修改约束
alter table t_student drop foreign key fk_classes_id_2;-- 删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);
alter table t_student drop primary key;-- 删除主键约束:alter table 表名 drop primary key
alter table t_student drop key uk;-- 删除约束约束:alter table 表名 drop key 约束名称
alter table t_student add constraint fk_classes_id_1 foreign key(classes_id) references t_classes(classes_id);-- • 添加外键约束:alter table 从表 add constraint 约束名称 foreign key 从表(外键字段) references 主表(主键字段);
alter table t_student add constraint pk primary key(student_id); -- 添加主键约束:alter table 表 add constraint 约束名称 primary key 表(主键字段);
alter table t_student add constraint uk unique(email); -- 添加唯一性约束:alter table 表 add constraint 约束名称 unique 表(字段)
alter table t_student modify student_name varchar(30) unique; -- 修改约束,其实就是修改字段,mysql对有些约束的修改时不支持,所以我们可以先删除,再添加