找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
视图:起到保护表数据的作用
show tables;#可以查询视图表
select * from student;
create view dcs as (select id,class,math from student)
#根据student表创建视图,dcs为视图名字,比如我只想把这三个字段暴露出来;
select * from dcs  #查看创建了视图的这个虚拟表,给三个字段创建了视图
show create view dcs #查看视图结构

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `dcs` AS (select `student`.`id` AS `id`,`student`.`class` AS `class`,`student`.`math` AS `math` from `student`)这一句是在视图结构的第二个字段复制出来的内容,创建视图的详细过程

delete from dcs where id=10
删除视图里面的数据id,然后分别查询视图表和原表的数据,都会同步被删除
update dcs  set math=100 where id=1
update student set math=99 where id=1
分别改视图表和原表的数据,验证数据同步被修改
drop view dcs
show create view dcs #删除视图表后查看创建视图的结构,报不存视图表

【外键约束】
主键约束primary key
非空约束not null
默认值约束default
自增长约束auto_increment
总结这里的四个约束,主要是约束表的字段


外键约束   foreign key  约束的是表与表之间的关系
create table dcs1(id int(4) primary key,name varchar(10)) engine=innodb;#主表
create table dcs2(sid int(4) primary key,sname varchar(10),constraint dcs foreign key(sid) references dcs1(id))engine=innodb; #子表
dcs1  主表
dcs2  子表
给dcs1创建一个名称为dcs的外键约束在dcs2的sid字段
constraint dcs :#约束,外键约束名称叫dcs
foreign key(sid) :#创建在dcs2表的sid字段上面
references dcs1(id) :#引用和参考的是dcs1表的id字段
engine=innodb :#数据库的储存引擎为innodb
如果不指定引擎默认使用myisam,使用的这个默认引擎不起作用
show engines :#查看mysql数据库的所有引擎

show create table dcs1#
show create table dcs2#查看表结构
CREATE TABLE `dcs2` (
  `sid` int(4) NOT NULL,
  `sname` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`sid`),
  CONSTRAINT `dcs` FOREIGN KEY (`sid`) REFERENCES `dcs1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

select * from dcs1;
select * from dcs2;

insert into dcs1 values(1,'xiaoyi'),(2,'xiaoer')
insert into dcs2 values(1,'xiaosan'),(3,'xiaosi')
#插入数据报错,在dcs1里面id只存在1和2,那么往dcs2表插入数据也只能插入1和2
insert into dcs2 values(1,'xiaosan'),(2,'xiaosi')#插入1和2就可以插入成功
#结论:主表不存在的数据,在任何的子表当中无法插入与之相关的数据

#删除表中的数据
delete from dcs1 where id=1;
#第一次删除主表的数据失败,报错提示存在一个子表里面有与之相关联的外键
delete from dcs2 where sid=1;
#先删除子表数据,再执行上面删除主表数据的sql语句就能删除成功

alter table dcs2 drop foreign key dcs;# 删除外键,使他们不存在约束

CREATE TABLE `dcs2` (
  `sid` int(4) NOT NULL,
  `sname` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci #删除之后,可以看出dcs2表没有外键了,没有关联之后可以直接删除主表数据
#在删除主表数据之后,当主表和子表没有相同相关联的数据时,再次创建外键因素会报错,创建外键约束,必须保证两个表有相同属性字段对应的相同数据

【MySQL中的存储过程】
drop procedure if exists dcs; #增强健壮性,如果dcs这个存储过程存在则删除
create procedure dcs(n int)#创建一个存储过程,名字叫dcs,n就是形式参数,数据类型为int整型
begin#存储过程的开始
        #存储过程的函数体,也可以理解为sql语句的集合
        declare i int(20) default(select count(*) from qq); #declare 定义
        /*drop table if exists qq;  #当qq表已经存在,先删除qq这个表
        create table qq(id int(20) primary key auto_increment,score int(20));
        insert into qq values(1,99),(2,65);
        insert into qq values(3,23),(4,98);
        insert into qq values(5,66),(6,77);
        insert into qq values(7,88),(8,49);*/
        #select * from qq;
        #select * from qq where id=1 #不带参数进行增删改查
        #select * from qq where id=n; #带参数进行查询操作
        if n=0 then
                select count(*) from qq;
        else if n>0 && n<=i then
                select max(score) from qq;
        else
                while n>i do
                insert into qq(score)values(66);
                set i=i+1;
                end while;
        end if;       
        end if;
        select * from qq;
end   #存储过程的结束
#先用end之前的(包括end)的所有代码然后选中运行会在左边函数里出现存储名称
       
call dcs(8); #调用dcs()这个存储过程,注意:创建跟调用不能同时选中执行,先执行创建再执行调用,执行调用后会执行之前end之前的所有代码进行实现,再创建存储过程的时候设置了形式参数,调用是必须填写实际参数,否则会报错


分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册