多表关联视图支持通过视图对单个基表的DML操作
功能描述
Vastbase在Oracle兼容模式下,对于多表关联的视图,支持通过视图对单个基表进行DML操作(插入、更新、删除)。
通过视图去修改基表,基表需要满足以下条件:
- 基表的每一行数据,最多对应视图里的一行数据。
- 基表在视图中没有null元组,即视图里的每一行数据,都能和基表的一行数据对应上。
注意事项
- 该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
- 该功能目前处于实验阶段,可能会遇到一些限制和不稳定的情况,建议按照文档谨慎操作以避免潜在风险,在使用中遇到任何问题请联系官方技术支持团队。
- 当增改视图时一次只能操作一个基表,通过所操作的列可判断出所要操作的基表,对此进行校验,不支持同时操作多个基表。
- 多表关联的连接类型,暂时仅支持内连接和左外连接。
- 仅支持基于普通表生成视图的情况,不支持临时表,分区表等。
- 不支持物化视图和临时视图。
- 不支持创建时带有
with check option
选项的视图。 - 多表连接时不支持有笛卡尔积的情况。
- 表之间的连接条件,仅支持等值连接,不支持如下情况:
- a.id>b.id
- 或运算符or
- 非运算符not
- 不支持对表之间的连接键没有唯一约束(主键、unique、外键、unique index)的视图进行DML操作。
示例
示例1: 通过视图对基表进行DML操作。
1、创建测试表。
create table table_1188398_1(id int, name varchar(20));
create table table_1188398_2 (id int, func_name varchar(20));
ALTER TABLE table_1188398_2 ADD CONSTRAINT table_1188398_2_pk PRIMARY KEY (id);
ALTER TABLE table_1188398_1 add constraint table_1188398_1_fk FOREIGN KEY (id) REFERENCES table_1188398_2(id);
INSERT INTO table_1188398_2 values (1, 'A_test');
INSERT INTO table_1188398_1 values (1, 'A');
2、创建多表关联视图。
create view v_1188398 as
select a.id,a.name, b.func_name
from table_1188398_1 a
left join table_1188398_2 b on a.id = b.id;
3、查询视图。
SELECT * FROM v_1188398;
返回结果为:
id | name | func_name
----+--------+------------
1 | A | A_test
(1 row)
4、向表2插入数据,并且通过视图向表1插入数据。
insert into table_1188398_2 values (2, 'B_test');
insert into v_1188398(id, name) values (2, 'B'); -- 此处都是 table_1188398_1 的字段,只向 table_1188398_1 表插入数据
5、查询表和视图内容。
SELECT * FROM v_1188398;
SELECT * FROM table_1188398_1;
返回结果为:
id | name | func_name
----+--------+------------
1 | A | A_test
2 | B | B_test
(2 rows)
id | name
-----+--------
1 | A
2 | B
(2 rows)
6、通过视图更新数据。
UPDATE v_1188398 SET name = 'clouds' WHERE id = 1;
7、查询表和视图内容。
SELECT * FROM v_1188398;
SELECT * FROM table_1188398_1;
返回结果为:
id | name | func_name
----+--------+------------
2 | B | B_test
1 | clouds | A_test
(2 rows)
id | name
-----+--------
2 | B
1 | clouds
(2 rows)
8、通过视图删除数据。
delete from v_1188398 where id=1;
9、查询表和视图内容。
SELECT * FROM v_1188398;
SELECT * FROM table_1188398_1;
返回结果为:
id | name | func_name
----+--------+------------
2 | B | B_test
(1 row)
id | name
-----+--------
2 | B
(1 rows)
示例2: 创建多表关联视图时使用别名。
1、创建测试表。
-- 创建my_table_1188559_1表
CREATE TABLE my_table_1188559_1 (
id NUMBER(6) PRIMARY KEY,
col2 VARCHAR2(50),
col3 VARCHAR2(50),
col4 NUMBER(4)
);
-- 创建my_table_1188559_2表
CREATE TABLE my_table_1188559_2 (
id2 NUMBER(4),
col2_2 VARCHAR2(50),
col3_2 NUMBER(4),
CONSTRAINT con_1188559 UNIQUE (id2)
);
2、创建多表关联视图(主表使用别名,次表不使用别名)。
CREATE VIEW my_table_1188559_view AS
SELECT a.id,a.col2,a.col3,a.col4,col2_2,col3_2
FROM my_table_1188559_1 a
inner JOIN my_table_1188559_2
ON a.id = id2;
3、通过视图向基表插入数据。
INSERT INTO my_table_1188559_view (id, col2, col3,col4) VALUES (1001, 'John', 'Doe', 50);
4、查询表内容。
select * from my_table_1188559_1;
返回结果为:
id | col2 | col3 | col4
----+--------+--------+--------
1001| John | Doe | 50
(1 row)