VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

多表关联视图支持通过视图对单个基表的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)