mysql一些简单应用设置触发禁止删除

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
1
<br data-filtered= "filtered" >



1.创建数据库

MariaDB [(none)]> create database utec default character set utf8 collate  utf8_general_ci;


2.创建数据表


部门表

MariaDB [utec]> create table bu(bu_name varchar(10));

Query OK, 0 rows affected (0.01 sec)


员工信息表

MariaDB [utec]> create table yg_info(id int,name varchar(10),sex enum('f','m'));

Query OK, 0 rows affected (0.01 sec)


员工薪资表

MariaDB [utec]> create table yg_money(id int,money int);

Query OK, 0 rows affected (0.01 sec)



员工部门表


MariaDB [utec]> create table yg_bu(id int,bu_name varchar(10));

Query OK, 0 rows affected (0.01 sec)


员工职位表


MariaDB [utec]> create table yg_identily(id int,jon varchar(10));

Query OK, 0 rows affected (0.00 sec)




3.插入数据


bu


MariaDB [utec]> insert into bu values('caiwu'),('it'),('yewu'),('yanfa'),('gongcheng');

Query OK, 5 rows affected (0.01 sec)

Records: 5  Duplicates: 0  Warnings: 0


MariaDB [utec]> select * from bu;

+-----------+

| bu_name   |

+-----------+

|     |

| caiwu     |

| it        |

| yewu      |

| yanfa     |

| gongcheng |

+-----------+



yg_info




MariaDB [utec]> alter table yg_info change id id int not null auto_increment primary key;  


MariaDB [utec]> delimiter $

MariaDB [utec]> create procedure insert_info() begin declare y int default 1; while y<10000 do insert into 

yg_info(name) values(concat('yg',y)); set y=y+1; end while; end$

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> delimiter ;

MariaDB [utec]> call insert_info();       ##插入9999条数据




MariaDB [utec]> delimiter $

MariaDB [utec]> create procedure insert_id() begin declare y int default 1; while y<10000  do 

insert into yg_money(id)values(y); 

insert into yg_bu(id)values(y); 

insert into yg_identily(id)values(y);

set y=y+1;end while; end$

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> delimiter ;

MariaDB [utec]> call insert_id();             ##更新其余几个表的ID




设定员工ID小于等于5000的 sex 为f  大于5000的为m

设定员工ID小于1000的工资 1500   ID在1001到3000的工资为1400   

ID在3001到5000的为1350   ID在5001到7000的工资为 1200

ID为7001到9999的工资为1100



MariaDB [utec]> delimiter $

MariaDB [utec]> create procedure utec_zong()

    -> begin

    -> update yg_info set sex='f' where id<=5000;

    -> update yg_info set sex='m' where id>5000;

    -> update yg_money set money=1500 where id<1000;

    -> update yg_money set money=1400 where id>=1000 and id<3000;

    -> update yg_money set money=1350 where id>=3000 and id<5000;

    -> update yg_money set money=1200 where id>=5000 and id<7000;

    -> update yg_money set money=1100 where id>=7000 and id<10000;

    -> end$

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> delimiter ;

MariaDB [utec]> call utec_zong();

Query OK, 3000 rows affected (0.79 sec)



设置触发  不允许插入ID<1  和ID>10000的



MariaDB [utec]> create trigger bi_yginfo before insert on yg_info for each row begin  

if new.id<1 then delete from yg_info where id<1; 

elseif new.id>10000 then delete from yg_info where id>10000; 

end if; end$

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> delimiter ;

MariaDB [utec]> 




设置外键


MariaDB [utec]> alter table yg_money add foreign key(id) references yg_info(id) on delete cascade on update cascade;

Query OK, 10000 rows affected (0.40 sec)               

Records: 10000  Duplicates: 0  Warnings: 0


MariaDB [utec]> alter table yg_bu add foreign key(id) references yg_info(id) on delete cascade on update cascade;

Query OK, 9999 rows affected (0.13 sec)                

Records: 9999  Duplicates: 0  Warnings: 0



MariaDB [utec]> alter table yg_identily add foreign key(id) references yg_info(id) on delete cascade on update cascade;

Query OK, 9999 rows affected (0.15 sec)                

Records: 9999  Duplicates: 0  Warnings: 0



测试下


MariaDB [utec]> insert into yg_money(id)values(10000);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`utec`.`yg_money`, CONSTRAINT `yg_money_ibfk_1` FOREIGN KEY (`id`) REFERENCES `yg_info` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

 ##外键约束




MariaDB [utec]> insert into yg_info (id)values(10000);

Query OK, 1 row affected, 1 warning (0.01 sec)  




MariaDB [utec]> insert into yg_info (id)values(10001);

ERROR 1442 (HY000): Can't update table 'yg_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

MariaDB [utec]>                                  ##触发约束




设置触发不允许删除和更新 yg_info的ID列



MariaDB [utec]> create trigger delete_yginfo before delete on yg_info for each row begin if old.id=id then rollback; end if; end$


ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger.


##mysql不可以给触发器显式或隐式方式开始或结束事务的语句的语句,比如COMMIT,START TRANSACTION,ROLLBACK。


MariaDB [utec]> create procedure rollbk()

    -> begin

    -> rollback;

    -> end$

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> create trigger delete_yginfo before delete on yg_info for each row begin if old.id=id then 

call rollbk; end if; end$

Query OK, 0 rows affected (0.01 sec)


MariaDB [utec]> delimiter ;

MariaDB [utec]> 





MariaDB [utec]> delete from yg_info where id=1;

ERROR 1054 (42S22): Unknown column 'id' in 'where clause'   ##这个报错是因为我的触发禁止删除导致   见下



MariaDB [utec]> drop trigger delete_yginfo;

Query OK, 0 rows affected (0.00 sec)


MariaDB [utec]> delete from yg_info where id=1;

Query OK, 1 row affected (0.00 sec)


MariaDB [utec]> select * from yg_info limit 2;

+----+------+------+

| id | name | sex  |

+----+------+------+

|  2 | yg2  | f    |

|  3 | yg3  | f    |

+----+------+------+

2 rows in set (0.00 sec)


MariaDB [utec]> 


本文转自 am2012 51CTO博客,原文链接:http://blog.51cto.com/goome/1966994


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
47 0
|
2月前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
176 0
|
3月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
721 4
|
29天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
72 3
|
29天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
85 2
|
2月前
|
架构师 关系型数据库 MySQL
MySQL最左前缀优化原则:深入解析与实战应用
【10月更文挑战第12天】在数据库架构设计与优化中,索引的使用是提升查询性能的关键手段之一。其中,MySQL的最左前缀优化原则(Leftmost Prefix Principle)是复合索引(Composite Index)应用中的核心策略。作为资深架构师,深入理解并掌握这一原则,对于平衡数据库性能与维护成本至关重要。本文将详细解读最左前缀优化原则的功能特点、业务场景、优缺点、底层原理,并通过Java示例展示其实现方式。
91 1
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
123 5
|
2月前
|
关系型数据库 MySQL 数据库连接
MySQL 表整行数据唯一性设置
MySQL 表整行数据唯一性设置
55 2
|
2月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
191 1
|
2月前
|
druid 关系型数据库 MySQL
开发指南048-mysql设置
如果链接的是mysql设置,需要做如下配置