mysql 当视图 view_a 得到的数据变化后,实表 table_a 如何同步数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 当视图 view_a 得到的数据变化后,实表 table_a 如何同步数据?相关的知识,希望对你有一定的参考价值。
视图 view_a:多表查询
实表 table_a:表结构和 view_a 相同,只读
-- --------------- 例如:
table_stu 和 table_teacher 关联 table_class
view_a 得到以上三张表的数据,(table_a 字段结构同 view_a)
目的:当修改 stu、teacher、class 时, 实时更新 table_a
表1:名字:mysql
表2:名字:accounts
这两个表在同一数据库。
账户很多,但是只希望alg_bank这个账户保持两张表数值相同。其他的不要变。
因为这两张表都是自己能变化的,所以希望不管哪个变化,另一个一起变化,总是保持相同。
希望有人能帮帮我,谢谢了。
这是我目前写的触发器里面,但是一修改mysql表里面的数据就报错。目前只在mysql这个表写了一个触发器,听说想要实时同步需要两个表各放一个触发器。
begin
UPDATE accounts.balance
SET algserver.accounts.balance = algserver.mysql.balance
where algserver.accounts.name like "%alg_bank" ;
end
MySQL之视图
什么是视图?
一张虚表,和真实的表一样。视图包含一系列带有名称的行和列数据。视图是从一个或多个表中导出来的,我们可以通过insert,update,delete来操作视图。当通过视图看到的数据被修改时,相应的原表的数据也会变化。同时原表发生变化,则这种变化也可以自动反映到视图中。
视图具有以下优点:
- 简单化:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化操作。经常被使用的查询可以制作成一个视图;
- 安全性:通过视图用户只能查询和修改所能见到的数据,数据库中其他的数据既看不见也取不到。数据库授权命令可以让每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定的行,列上;
- 逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。
视图和表的区别以及联系是什么?
两者的区别:
- 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化的表,而表不是;
- 视图没有实际的物理记录,而表有;
- 表是内容,视图窗口;
- 表和视图虽然都占用物理空间,但是视图只是逻辑概念存在,而表可以及时对数据进行修改,但是视图只能用创建语句来修改 ;
- 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全角度来说,视图可以防止用户接触数据表,因而不知道表结构 ;
- 表属于全局模式中的表,是实表。而视图属于局部模式的表,是虚表;
- 视图的建立和删除只影响视图本身,而不影响对应表的基本表。
两者的联系:
视图是在基本表之上建立的表,它的结构和内容都来自于基本表,它依赖基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本的抽象和逻辑意义上建立的关系。
一、创建视图
1、创建单表视图
#创建表
mysql> create table t(
-> quantity int,
-> price int
-> );
#插入数据
mysql> insert into t values(3,50);
#创建视图
mysql> create view view_t as select quantity,price,quantity*price as total from t;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from view_t; 查看视图中的数据
+----------+-------+-------+
| quantity | price | total |
+----------+-------+-------+
| 3 | 50 | 150 |
+----------+-------+-------+
1 row in set (0.01 sec)
2、创建多表视图
#创建基本表
mysql> create table student(
-> s_id int(3) primary key,
-> s_name varchar(30),
-> s_age int(3),
-> s_sex varchar(8)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table stu_info(
-> s_id int(3),
-> class varchar(50),
-> addr varchar(100)
-> );
Query OK, 0 rows affected (0.01 sec)
#插入数据
mysql> insert into stu_info values
-> (1,‘erban‘,‘anhui‘),
-> (2,‘sanban‘,‘chongqing‘),
-> (3,‘yiban‘,‘shandong‘);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
#创建视图
mysql> create view stu_class(id,name,class) as
-> select student.s_id,student.s_name,stu_info.class
-> from student,stu_info where student.s_id=stu_info.s_id;
3、查看视图的相关信息
#查看视图的表结构
mysql> desc stu_class;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(3) | NO | | NULL | |
| name | varchar(30) | YES | | NULL | |
| class | varchar(50) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#查看视图的基本信息
mysql> show table status like ‘stu_class‘G
*************************** 1. row ***************************
Name: stu_class
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.00 sec)
#查看视图的详细信息
mysql> show create view stu_classG
*************************** 1. row ***************************
View: stu_class
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`s_id` AS `id`,`student`.`s_name` AS `name`,`stu_info`.`class` AS `class` from (`student` join `stu_info`) where (`student`.`s_id` = `stu_info`.`s_id`)
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
#也可以直接查询information_schema库中的views表,来查看所有的视图
mysql> select * from information_schema.views where table_schema=‘test1‘G
#where后面指定的是一个库名,也就是查看test02这个库中的所有视图
4、修改视图
方法一:
mysql> create or replace view view_t as select * from t;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from view_t; 查看修改后的视图
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
方法二:
#修改指定视图的列名
mysql> alter view view_t(abc) as select quantity from t;
Query OK, 0 rows affected (0.00 sec)
#查看修改后的表结构
mysql> desc view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| abc | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
5、更新视图
1)update指令更新
#查看表以及视图的数据,其中quantity对应视图的abc字段
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
mysql> select * from view_t;
+------+
| abc |
+------+
| 3 |
+------+
1 row in set (0.01 sec)
mysql> update view_t set abc=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#查看更新后的视图
mysql> select * from view_t;
+------+
| abc |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
#查看更新后的表
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
2)insert指令更新
#查看表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
#查看视图的数据
mysql> select * from view_t;
+------+
| abc |
+------+
| 5 |
+------+
1 row in set (0.00 sec)
#向表中插入数据
mysql> insert into t values(3,5);
Query OK, 1 row affected (0.00 sec)
#查看视图的数据
mysql> select * from view_t;
+------+
| abc |
+------+
| 5 |
| 3 |
+------+
2 rows in set (0.00 sec)
#查看表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
| 3 | 5 |
+----------+-------+
3) delete指令删除表数据
#创建新的视图
mysql> create view view_t2(qty,price,total) as select quantity,price,quantity*price from t;
mysql> select * from view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
| 3 | 5 | 15 |
+------+-------+-------+
2 rows in set (0.00 sec)
#删除视图中的数据
mysql> delete from view_t2 where price=5;
Query OK, 1 row affected (0.00 sec)
#再次查看视图的数据
mysql> select * from view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 5 | 50 | 250 |
+------+-------+-------+
1 row in set (0.00 sec)
查看原表的数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.00 sec)
6、删除视图
mysql> drop view view_t;
以上是关于mysql 当视图 view_a 得到的数据变化后,实表 table_a 如何同步数据?的主要内容,如果未能解决你的问题,请参考以下文章