外键,触发器,函数, 定时任务,存储过程,视图

外键,触发器,函数,

定时任务,存储过程,视图


外键

环境 a,b两张表 分别创建 id ,name age 三列

一张表修改后 , 需要另一张表也做修改的情况

创建外键
ON DELETE RESTRICT(默认)
alter table 表名 add constraint 外键名 foreign key a(name) references b(name);  # 添加外键
CONSTRAINT `a` FOREIGN KEY (`name`) REFERENCES `t2` (`name`)   #创建外键 在创建表时候添加

默认 ON DELETE RESTRICT a表name关联到b表name

添加: a表只能添加name值跟b表对应的数据 , b表添加一行a表无变化

删除: 先删除a表对应的行,才能删除b表的行, a表删除一行对b表无影响, b表不能删除行,只能先删除a表对应的行,再删除b表的行

修改: ab表都不能修改name列, 除非b表的name列值在a表中没创建

ON DELETE CASCADE
alter table 表名 add constraint 外键名 foreign key a(name) references b(name) ON DELETE CASCADE;  # 添加外键
CONSTRAINT `a` FOREIGN KEY (`name`) REFERENCES `t2` (`name`) ON DELETE CASCADE   #创建外键 在创建表时候添加

b表删掉一行数据a表也会删除

ON DELETE SET NULL
alter table 表名 add constraint 外键名 foreign key a(name) references b(name) ON DELETE SET NULL;  # 添加外键
CONSTRAINT `a` FOREIGN KEY (`name`) REFERENCES `t2` (`name`)  ON DELETE SET NULL;  #创建外键 在创建表时候添加

b表删除一行 a表对应name值是空

ON UPDATE CASCADE
alter table 表名 add constraint 外键名 foreign key a(name) references b(name) ON UPDATE CASCADE;  # 添加外键
CONSTRAINT `a` FOREIGN KEY (`name`) REFERENCES `t2` (`name`) ON UPDATE CASCADE;  #创建外键 在创建表时候添加

修改b表name时a表name也会相应改变

删除外键
alter table 表名 drop foreign key 外键名;
查看外键
show create table 表名;  # 也就是查看建表语句

触发器

对数据库的a表进行增删改时候,希望也修改另外一张表b 这时候就需要触发器

插入,删除,更新
插入前  
delimiter $$
CREATE TRIGGER aa BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
    insert into t2 (name) values("abc");
END $$
delimiter ;


插入后
delimiter $$
CREATE TRIGGER aa AFTER INSERT ON t1 FOR EACH ROW
BEGIN
    insert into t2 (name) values("abc");
END $$
delimiter ;

其他的

删除前后 BEFORE DELETE , AFTER DELETE

更新前后 BEFORE UPDATE , AFTER UPDATE

FOR EACH ROW : 针对每一行都触发

删除触发器: DROP TRIGGER 触发器名字;

查看触发器
show TRIGGERS;
也可以查看  information_schema.triggers
if判断语句
delimiter $$
CREATE TRIGGER bb BEFORE INSERT ON t1 FOR EACH ROW
BEGIN
    if new.name = 'alex' then 
        insert into t2 (name) values("abc");
    end if;
END $$
delimiter ;

判断如果插入t1表的name只值是'alex' 就执行sql insert into t2 (name) values("abc");

delimiter $$
CREATE TRIGGER cc BEFORE DELETE ON t1 FOR EACH ROW
BEGIN
    if old.name = 'alex' then 
        insert into t2 (name) values("alex");
    end if;
END $$
delimiter ;

判断如果删除t1表中的name值 是'alex' 就执行sql

new 新增的一行数据 new.name是刚插入的name值

old 删除的哪一行数据 old.name是刚删除的name值


函数

用在sql语句中的变量

定义一个函数
delimiter &&
create function f1(
    i1 int,
    i2 int) 
returns int 
BEGIN 
    declare num int; 
    declare maxId int; 
    select max(id) from t1 into maxId; 
    set num=i1 +i2 + maxId; 
    return(num); 
END && 
delimiter ; 

解释:

delimiter && : 改变之前的sql语句是;结尾改成&&

创建函数f1 ,接收两个变量i1和i2 ,

定义两个变量num和maxId

执行sql语句 把结果传给maxId + i1 + i2 =num 返回

END && 函数创建完成

delimiter ; 改回分号

执行函数: select f1(11,22) select f1(11,id) ,name from t1;

mysql 配置文件要加这个参数: log_bin_trust_function_creators=1 是否可以信任存储函数创建者 ,要是root用户可以不开 其他用户必须开

查看函数
show function status; 
select `name` from mysql.proc where db = 'kaoshi' and `type` = 'FUNCTION'  #查看kaoshi库下的函数
show CREATE FUNCTION f11

视图

视图就是一个临时表

创建视图
create view v1 as select id,name from t1 where id > 1;

执行视图: select * from v1;

删除视图: drop view v1;

修改视图: alter view v1 as SQL语句

查看视图
SELECT * from information_schema.VIEWS
show CREATE VIEW dsrw

存储过程

一堆sql语句封装到一起

定义存储过程
delimiter &&
create procedure p1()
BEGIN
    select * from t1;
END &&
delimiter ;

执行存储过程: call p1();

删除存储过程: drop procedure p1;

查看存储过程
 show procedure status; 
 select * from mysql.proc where db = 'kaoshi' and `type` = 'PROCEDURE'   # 查看kaoshi库下的存储过程
 
 show create procedure p1; #查看存储过程的创建语句

定时任务

存储过程 + 定时任务

sql_mode=ANSI_QUOTES # 要关闭

"视为标识符引用字符(如""引用字符),而不是字符串引用字符。启用此模式后,您仍然可以使用`来引用标识符。启用ansi_quotes后,不能使用双引号来引用文字字符串,因为它们被解释为标识符。

event_scheduler =1; # 要打开

介绍
查看定时任务是否开启
show VARIABLES LIKE '%event_scheduler%';
select @@event_scheduler;

开启定时任务功能
set global event_scheduler =1;

查看本机所有定时任务
SELECT * FROM information_schema.EVENTS;
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;

单位有 second,minute,hour,day,week(周),quarter(季度),month,year
创建一个存储过程
delimiter &&
create procedure p1()
BEGIN
    insert into t2 (name,time) values("abc",now());
END &&
delimiter ;
创建定时任务执行存储过程
create database kxm;
use kxm;
create table t1 (id int primary key , name varchar(22));
insert into t1(id,name) values (2,"aaaa");

delimiter &&
create procedure p1()
BEGIN
    create table t1 (id int primary key , name varchar(22));
END &&
delimiter ;

create event second_event
on schedule every 1 second
on completion preserve disable
do call p1();

alter event second_event on completion preserve enable;
SELECT * FROM information_schema.EVENTS;
create event second_event
on schedule every 1 second
on completion preserve disable
do call p1();
  1. 第一行create event second_event是创建名为second_event的事件,注意此处没有括号
  2. 第二行是创建周期定时的规则,本处的意思是每秒钟执行一次
  3. 第三行on completion preserve disable是表示创建后并不开始生效。
  4. 第四行do call p1(); 是该event(事件)的操作内容,表示调用我们刚刚创建的call p1();存储过程
开关 定时任务
alter event second_event on completion preserve enable;    //开启定时任务  second_event是存储过程名
alter event second_event on completion preserve disable;   //关闭定时任务
周期定时规则
周期执行–关键字 EVERY
on schedule every 1 second     //每秒执行1次
on schedule every 2 minute     //每两分钟执行1次
on schedule every 3 day        //每3天执行1次
在具体某个时间执行–关键字 AT
on schedule at current_timestamp()+interval 5 day          //5天后执行
on schedule at current_timestamp()+interval 10 minute      //10分钟后执行
on schedule at '2016-10-01 21:50:00'                       //在2016年10月1日,晚上9点50执行
在某个时间段执行–关键字STARTS ENDS
on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month //5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day         //从现在起每天执行,执行5天

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容