MySQL学习小结(二)常用的创建表、修改表的语句

版权声明: https://blog.csdn.net/qq_21578125/article/details/89082332
-- 创建表

/*
语法格式:
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对有些约束的修改时不支持,所以我们可以先删除,再添加




猜你喜欢

转载自blog.csdn.net/qq_21578125/article/details/89082332