暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB 系统表和系统视图概述

原创 由迪 2022-06-20
470

系统表是MogDB存放结构元数据的地方,它是MogDB数据库系统运行控制信息的来源,是数据库系统的核心组成部分。

系统视图提供了查询系统表和访问数据库内部状态的方法。

系统表和系统视图要么只对管理员可见,要么对所有用户可见。下面的系统表和视图有些标识了需要管理员权限,这些系统表和视图只有管理员可以查询。

用户可以删除后重新创建这些表、增加列、插入和更新数值,但是用户修改系统表会导致系统信息的不一致,从而导致系统控制紊乱。正常情况下不应该由用户手工修改系统表或系统视图,或者手工重命名系统表或系统视图所在的模式,而是由SQL语句关联的系统表操作自动维护系统表信息。

img 须知: 用户应该禁止对系统表进行增删改等操作,人为对系统表的修改或破坏可能会导致系统各种异常情况甚至MogDB不可用。

支持updatable-views

视图可更新指的是用户可以通过视图对视图对应的基表进行INSERT/UPDATE/DELETE操作来更新基表的数据。

为了使视图可更新,视图中的行与基表中的数据行必须要有一一对应的关系,具体来说,视图中存在以下内容的时候,则该视图不可更新:

  • 聚合函数或者窗口函数,比如sum、count、min、max、avg等
  • DISTINCT语句
  • HAVING、GROUP BY、START WITH、CONNECT BY
  • UNION、UNION ALL、INTERSECT、EXCEPT
  • 选择列中有子查询
  • FROM子句中有不可更新的视图
  • WHERE子句中的字子查询引用了FROM子句中的表
  • 视图定义中的列由函数或者表达式产生,例如decode(...)
  • 对于JOIN视图
    • 多表连接的视图做DML的时候必须存在不少于1张带有唯一键或者主键的基表
    • 多表连接的视图上的任何INSERT、UPDATE或DELETE操作一次只能修改一个基表

示例

INSERT VIEW

CREATE TABLE IF NOT EXISTS table1(id int, a char(6), b varchar(6), c varchar(6)); INSERT INTO table1 VALUES(1, reverse('123A78'), '123A78', '1sdfBB'); INSERT INTO table1 VALUES(2, reverse('E3gw78'), 'E3g78', 'lkoier'); INSERT INTO table1 VALUES(3, reverse('HHiiw6'), 'Hiw6', '23fdsg'); CREATE VIEW test_view AS SELECT * FROM table1 WHERE id > 1; INSERT INTO test_view VALUES(4, '2sdafd', '23ata', 'dstsee'); SELECT * FROM table1 WHERE id = 4; id | a | b | c ----+--------+-------+-------- 4 | 2sdafd | 23ata | dstsee (1 row) DROP VIEW IF EXISTS test_view; DROP TABLE IF EXISTS table1;
复制

UPDATE VIEW

CREATE TABLE IF NOT EXISTS table1(id int, a char(6), b varchar(6), c varchar(6)); INSERT INTO table1 VALUES(1, reverse('123A78'), '123A78', '1sdfBB'); INSERT INTO table1 VALUES(2, reverse('E3gw78'), 'E3g78', 'lkoier'); INSERT INTO table1 VALUES(3, reverse('HHiiw6'), 'Hiw6', '23fdsg'); CREATE VIEW test_view AS SELECT * FROM table1 WHERE id > 1; UPDATE test_view SET a = '2222' WHERE id = 2; SELECT * FROM table1; id | a | b | c ----+--------+--------+-------- 1 | 87A321 | 123A78 | 1sdfBB 3 | 6wiiHH | Hiw6 | 23fdsg 2 | 2222 | E3g78 | lkoier (3 rows) DROP VIEW IF EXISTS test_view; DROP TABLE IF EXISTS table1;
复制

DELETE VIEW

CREATE TABLE IF NOT EXISTS table1(id int, a char(6), b varchar(6), c varchar(6)); INSERT INTO table1 VALUES(1, reverse('123A78'), '123A78', '1sdfBB'); INSERT INTO table1 VALUES(2, reverse('E3gw78'), 'E3g78', 'lkoier'); INSERT INTO table1 VALUES(3, reverse('HHiiw6'), 'Hiw6', '23fdsg'); CREATE VIEW test_view AS SELECT * FROM table1 WHERE id > 1; DELETE FROM test_view WHERE id = 2; SELECT * FROM table1 WHERE id > 1; id | a | b | c ----+--------+------+-------- 3 | 6wiiHH | Hiw6 | 23fdsg (1 row) DROP VIEW IF EXISTS test_view; DROP TABLE IF EXISTS table1;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论