mysql数据对象
2018-06-17 22:49:28来源:未知 阅读 ()
- 了解掌握常见的几种数据库对象
- 学会如何创建具体的数据对象
- 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)
- 唯一约束是一种特殊的索引
- 唯一约束可以是一个或者多个字段
- 位于约束可以在建表的时候建好,也可以后面补上
- 主键也是一种唯一约束
- 主键索引 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}
- 触发器对性能有损耗,应慎用
- 同一类事件在一个表中只能创建一次
- 对于事务表,触发器执行失败则整个语句回滚
- 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
- 中间变量定义: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
- 自定义函数与存储过程类似,但是必须带有返回值
- 自定义函数与sum(),max(),等mysql原生函数使用方法类似: select func(val); select * from tbl where col = func(val)
- 由于自定义函数可能在遍历数据中使用,要注意性能损耗
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字段;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- MySQL replace函数怎么替换字符串语句 2020-03-09
- PHP访问MySQL查询超时怎么办 2020-03-09
- mysql登录时闪退 2020-02-27
- MySQL出现1067错误号 2020-02-27
- mysql7.x如何单独安装mysql 2020-02-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash