mysql数据对象
- 了解掌握常见的几种数据库对象
- 学会如何创建具体的数据对象
- DataBase/Schema
- Table
- Index
- View/Trigger/Function/Procedure
- 业务的隔离
- 资源的隔离
- 索引
- 约束
- 视图,触发器,函数,存储过程
mysql> help create index
Name: 'CREATE INDEX'
Description:
Syntax:
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_option] ..
mysql> select * from vc;
+------+------+
| v | c |
+------+------+
| AB | AB |
+------+------+
1 row in set (0.00 sec) mysql> create index idx_v on vc(v);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table vc add KEY idx_c (c);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from vc;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| vc | 1 | idx_v | 1 | v | A | 1 | NULL | NULL | YES | BTREE | | |
| vc | 1 | idx_c | 1 | c | A | 1 | NULL | NULL | YES | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec) mysql> show create table vc;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| vc | CREATE TABLE `vc` (
`v` varchar(5) DEFAULT NULL,
`c` char(5) DEFAULT NULL,
KEY `idx_v` (`v`),
KEY `idx_c` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 唯一约束是一种特殊的索引
- 唯一约束可以是一个或者多个字段
- 位于约束可以在建表的时候建好,也可以后面补上
- 主键也是一种唯一约束
![](/Users/apple/AppData/Local/Temp/enhtmlclip/Image.png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203333669-127687763.png)
- 主键索引 ID
- 单键索引 orderid
- 单键索引 bookid
- 组合索引 (userid + orderid)
- 主键约束 ID
- 单键唯一索引 orderid
- 组合唯一索引 userid+orderid
mysql> alter table order add primary key (id)
#实际上是给主键id增加了一个索引,而这个索引又是唯一的所以就这个索引就变成了唯一约束
mysql>alter table order add unique key idx_uk_orderid(id)
mysql > alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid)
mysql > alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid) on delete restrict on update cascade;
mysql> select * from c_A;
+----+------+
| id | age |
+----+------+
| 1 | 22 |
| 2 | 3 |
| 3 | 4 |
+----+------+
3 rows in set (0.00 sec) mysql> select * from c_B;
+----+------+
| id | age |
+----+------+
| 1 | 2 |
| 2 | 33 |
| 3 | 4 |
+----+------+
3 rows in set (0.00 sec) mysql> update c_B set id=11 where age = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from c_B;
+----+------+
| id | age |
+----+------+
| 2 | 33 |
| 3 | 4 |
| 11 | 2 |
+----+------+
3 rows in set (0.00 sec) mysql> select * from c_A;
+----+------+
| id | age |
+----+------+
| 2 | 3 |
| 3 | 4 |
| 11 | 22 |
+----+------+
3 rows in set (0.00 sec)
on delete cascade | insert | update | delete |
parent | yes | 只能更改子表中约束字段没有的值 | yes |
child | 只能插入父表中约束字段有的值; | 只能更改父表中约束字段没有的值 | yes |
on update cascade | insert | update | delete |
parent | yes | yes | 只能删子表中约束字段没有的值; |
child | 只能插入父表中约束字段有的值; | 只能更新父表中约束字段没有的值 | yes |
- 必须是innodb表,其他引擎不支持外键
- 相互约束的字段类型必须要一样
- 主表的约束字段要求有索引(上面的例子中,user表就是主表,所以在user表中要userid要求加上索引 )
- 约束名称必须要唯一,即使不在一张表上(constarint_uid 在整个库中是唯一的)
mysql> alter table order drop FOREIGN KEY constarint_uid;
- 视图将一组查询语句构成的结果集,是一种虚拟结构,并不是实际数据
- 视图能简化数据库的访问,能够将多个查询语句结构化为一个虚拟结构
- 视图可以隐藏数据库后端表结构,提高数据库的安全性
- 视图也是一种权限管理,只对用户提供部分数据
mysql > create view order_view as select * from order where status = 1
mysql> CREATE TABLE t (qty INT, price INT);
mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
- 数据订正;
- 迁移表;
- 实现特定的业务逻辑;
- 执行者
- 调用者
CREATE
[DEFINER = {user | CURRENT_USER}] -- 定义执行着的权限
TRIGGER trigger_name trigger_time
trigger_event ON tbl_name
FOR EACH ROW --涉及的每一行都会执行trigger_body
trigger_body t trigger_time:{BEFORE | AFTER}
trigger_event:{INSERT | UPDATE | DELETE}
![](/Users/apple/AppData/Local/Temp/enhtmlclip/Image(1).png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203411372-299546139.png)
- 触发器对性能有损耗,应慎用
- 同一类事件在一个表中只能创建一次
- 对于事务表,触发器执行失败则整个语句回滚
- row格式主从复制,触发器不会在从属库上执行
- 使用触发器时应该防止递归执行
- 使用灵活,可以使用流控制语句,自定义变量等完成复杂的业务逻辑
- 提高数据安全性,屏蔽应用程序直接对表的操作,易于进行审计
- 减少网络传输
- 提高代码维护的复杂度,实际使用中要评估场景是否适合
CREATE
[ DEFINER = { user | CURRENT_USER } ] --定义执行着的权限
PROCEDURE sp_name ( [ proc_parameter[ ,... ] ] )
[ characteristic .. ] routine_body proc_parameter:
[ IN | OUT | INOUT] param_name type
type:
Any valid MySQL data type
![](/Users/apple/AppData/Local/Temp/enhtmlclip/Image(2).png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203546013-2026339282.png)
- 中间变量定义:DECLARE
- 流控制语句
- 参数传入
mysql> show PROCEDURE STATUS ;
mysql> SHOW TRIGGER STATUS ;
mysql> set @total = 5;
mysql> set @res = 0;
mysql> call proc_test1(@total,@res);
mysql> select @res
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
![](/Users/apple/AppData/Local/Temp/enhtmlclip/Image(3).png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203600451-1680784622.png)
- 自定义函数与存储过程类似,但是必须带有返回值
- 自定义函数与sum(),max(),等mysql原生函数使用方法类似: select func(val); select * from tbl where col = func(val)
- 由于自定义函数可能在遍历数据中使用,要注意性能损耗
![](/Users/apple/AppData/Local/Temp/enhtmlclip/Image(4).png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203613779-1387410676.png)
![](https://images2015.cnblogs.com/blog/820365/201607/820365-20160719203631529-13286883.png)
mysql> select func_test1(4);
- 触发器和存储过程不利于水平扩展,多用于统计和运维操作中;
- 还有代码管理维护成本比较高;
- 但是:
- 简化应用开发,减少数据传输,提高处理效率;
- 索引的创建于查看
- 约束:
- 唯一约束,
- 外键约束:
- alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid);
- 外键约束四种模式:restrict,no action,set null,cascade;
- VIEW
- TIGGER:
- 一个表的一个事件只能定义一个触发器
- delimiter //
- NEW.age OLD.age
- PROCEDURE:
- DECLARE,
- 参数传入返回
- 流控制语言
- 使用三步骤
- 初始化参数
- 调用存储过程
- 查看放回值
- function:
- 必须带有返回值
- 使用select func_test1(14);
- SUBSTRING( goods_name,1,5 ):从位置1截取goods_name5个字符
- A rigth join B on..:B显示B中null字段;
mysql数据对象的更多相关文章
- MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题
1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...
- 浅析MySQL数据碎片的产生(data free)
浅析MySQL数据碎片的产生 2011-03-30 09:28 核子可乐译 51CTO 字号:T | T MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生 ...
- Java数据库——处理大数据对象
处理大数据对象 CLOB中可以存储海量文字 BLOB中可以存储海量二进制数据 如果程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本 ...
- 设置MySQL数据表主键
设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...
- Kettle的应用——对mysql数据进行表输入与导出
Kettle的应用——对mysql数据进行表输入与导出 1. 下载好kettle解压包 网址:http://sourceforge.net/projects/pentaho/files/Data%20 ...
- Mysql数据实时同步
企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...
- MySQL数据库对象-索引
1. 概述2. 索引分类2.1 不同索引的概念2.1.1 普通索引2.1.2 唯一索引2.1.3 全文索引2.1.4 多列索引3. 索引操作3.1 普通索引3.1.1 创建表时创建普通索引3.1.2 ...
- mysql的对象
mysql 常见的数据对象有哪些: DataBase/Schema Table Index View/Trigger/Function/Procedure 多Database用途: 业务的隔离 ...
- tp5 使用paginate分页获取数据对象之后 如何对对象进行数据添加
tp5 使用paginate分页获取数据对象之后 如何对对象进行数据添加 大家都知道,在使用tp5的paginate获取分页数据之后,得到的是一个数据对象,但有时会碰到要对数据对象进行二次加工的情况, ...
随机推荐
- leetcode 【 Pascal's Triangle 】python 实现
题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,R ...
- leetcode 【 Convert Sorted List to Binary Search Tree 】python 实现
题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...
- jmeter将上一个请求的结果作为下一个请求的参数——使用正则提取器
转自:http://www.cnblogs.com/0201zcr/p/5089620.html 在压力测试的时候,经常要将几个流程串联起来才能将程序测试通过.如:我现在用户首先要登录,获得我登录的凭 ...
- Robotium测试报告的生成方法(上)
7.1 使用junit-report生成报告 这个是参考网上的:http://www.xuebuyuan.com/2148574.html,经我个人验证是可行的方法,网上写的挺详细的,不过有些不太清楚 ...
- Python+Selenium基础篇之4-XPath的使用
开始写自动化脚本之前,我们先学习几个概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列,我们说的元素之网页元素(web element).在网页上面 ...
- 前端应该掌握的CSS实现多列等高布局
1.引言 我们在写页面的时候,有的时候会遇到多栏布局,每个栏目里面的内容有的时候可能不一样,这样就会导致每个栏目实际的高度也是不一样的,如果每个栏目有背景颜色的,就会导致每个栏目的底部是对不齐的,用户 ...
- c++ 吕凤翥 第五章 类对象一
一 类的声明和实现 1. class tdate //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...
- 【转】tomcat与apache,tomcat与servlet的区别
tomcat与apache的区别:(转自:http://blog.csdn.net/longzs/article/details/10959945) 1.apache支持静态页,tomcat支持动态的 ...
- [usaco jan 09] 安全路径 travel [最短路径树]
题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短 ...
- 个人环境搭建——搭建jenkins持续构建集成环境
---恢复内容开始--- 搭建jenkins持续构建集成环境 要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK: 第一部分,基本说明: 敏捷(Agile) 在软件工程领域 ...