会话

会话变量

有关于会话变量在实际应用中可能会用到,而会话变量的类型也比较多,常见的值主要有以下几种:

  • enable_experimental_alter_column_type_general:默认值为false,如设置为true,则在一般情况下用作列类型更改。
  • experimental_enable_hash_sharded_indexes: 默认值为off,如果设置为on,用于散列分片索引。
  • experimental_enable_temp_tables: 默认值为off,如果设置为on,用于临时对象,包括临时表、临时视图。

列类型更改

对更改列数据类型的支持是的,有一定的限制。要启用列类型更改,请将enable_experimental_alter_column_type_general 会话变量设置为true.以下在 Hubble中是等价的:

  • ALTER TABLE ... ALTER ... TYPE
  • ALTER TABLE ... ALTER COLUMN TYPE
  • ALTER TABLE ... ALTER COLUMN SET DATA TYPE

更改数据类型的限制,在以下情况下,不能更改列的数据类型:

  • 该列是索引的一部分。
  • 该列有CHECK约束。
  • 该列拥有一个序列。
  • ALTER COLUMN TYPE声明是合并ALTER TABLE声明的一部分。

string改成varchar(n),必须保证n大于现有数据的最大长度,否则会导致数据缺失。 字段只能进行扩长,不能进行缩减。 要更改数据的类型,首先要将会话变量设置为true,可以理解为先开会话,后改数据类型。

数据类型转换

  • 表结构
create table cust(id varchar(20),
age int,
sal DECIMAL(12,2),
pers DECIMAL(12,2));
  • 将会话变量设置为true
SET enable_experimental_alter_column_type_general = true;
  • int类型改为string类型
alter table cust alter age type string;
  • DECIMAL改为string
alter table cust alter sal type string;
  • 查看信息
show  columns from cust;
 column_name |   data_type   | is_nullable | column_default | generation_expression |  indices  | is_hidden
--------------+---------------+-------------+----------------+-----------------------+-----------+------------
  id          | VARCHAR(20)   |    true     | NULL           |                       | {}        |   false
  age         | STRING        |    true     | NULL           |                       | {}        |   false
  sal         | STRING        |    true     | NULL           |                       | {}        |   false
  pers        | DECIMAL(12,2) |    true     | NULL           |                       | {}        |   false
  rowid       | INT8          |    false    | unique_rowid() |                       | {primary} |   true

更改数据类型精度

  • DECIMAL类型精度改变只能变大,不能变小
ALTER TABLE cust ALTER pers TYPE DECIMAL(14,2);
  • 查看信息
show  columns from cust;
 column_name |   data_type   | is_nullable | column_default | generation_expression |  indices  | is_hidden
--------------+---------------+-------------+----------------+-----------------------+-----------+------------
  id          | VARCHAR(20)   |    true     | NULL           |                       | {}        |   false
  age         | STRING        |    true     | NULL           |                       | {}        |   false
  sal         | STRING        |    true     | NULL           |                       | {}        |   false
  pers        | DECIMAL(14,2) |    true     | NULL           |                       | {}        |   false
  rowid       | INT8          |    false    | unique_rowid() |                       | {primary} |   true

临时表

细节说明

  • 临时表会在会话结束时自动删除。
  • 只能从创建临时表的会话中访问临时表。
  • 临时表在同一会话中的事务中持续存在。
  • 临时表可以引用持久表,但持久表不能引用临时表。
  • 临时表不能转换为持久表。

创建临时表

  • 前置条件:要使用临时表,需要设置experimental_enable_temp_tables为on
SET experimental_enable_temp_tables=on;
  • 创建样例
CREATE TEMP TABLE users (
        id UUID,
        city STRING,
        name STRING,
        address STRING,
        CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC)
);
  • SHOW CREATE查看临时表
SHOW CREATE TABLE users;
 table_name |                     create_statement
-------------+-----------------------------------------------------------
  users      | CREATE TEMP TABLE pg_temp_1648014738602055526_1.users (
             |     id UUID NOT NULL,
             |     city STRING NOT NULL,
             |     name STRING NULL,
             |     address STRING NULL,
             |     CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC),
             |     FAMILY "primary" (id, city, name, address)
             | )
  • 创建领一张临时表引用users
CREATE TEMP TABLE vehicles (
        id UUID NOT NULL,
        city STRING NOT NULL,
        type STRING,
        owner_id UUID,
        creation_time TIMESTAMP,
        CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC),
        CONSTRAINT fk_city_ref_users FOREIGN KEY (city, owner_id) REFERENCES users(city, id)
);
SHOW CREATE TABLE vehicles;
  table_name |                                     create_statement
-------------+--------------------------------------------------------------------------------------------
  vehicles   | CREATE TEMP TABLE vehicles (
             |     id UUID NOT NULL,
             |     city STRING NOT NULL,
             |     type STRING NULL,
             |     owner_id UUID NULL,
             |     creation_time TIMESTAMP NULL,
             |     CONSTRAINT "primary" PRIMARY KEY (city ASC, id ASC),
             |     CONSTRAINT fk_city_ref_users FOREIGN KEY (city, owner_id) REFERENCES users(city, id),
             |     INDEX vehicles_auto_index_fk_city_ref_users (city ASC, owner_id ASC),
             |     FAMILY "primary" (id, city, type, owner_id, creation_time)
             | )
(1 row)
  • 显示会话中所有临时表
SHOW TABLES FROM pg_temp;
         schema_name          | table_name | type  | owner | estimated_row_count | locality
--------------------------------+------------+-------+-------+---------------------+-----------
  pg_temp_1648014738602055526_1 | users      | table | root  |                   0 | NULL
  pg_temp_1648014738602055526_1 | vehicles   | table | root  |                   0 | NULL
  • 取消会话
SHOW session_id;
             session_id
------------------------------------
  15fd69f9831c1ed00000000000000001
(1 row)
CANCEL SESSION '15fd69f9831c1ed00000000000000001';

临时视图

细节说明

  • 会话结束时会自动删除临时视图。
  • 临时视图只能从创建它的会话中访问。
  • 临时视图在同一会话中的事务中持续存在。
  • 临时视图不能转换为持久视图。

创建临时视图

  • 前置条件:要使用临时视图,需要设置experimental_enable_temp_tables为on
SET experimental_enable_temp_tables=on;
  • 视图样例
 CREATE TEMP VIEW temp_user_view (sname ,sage )
as select
name,
age
from custs;
SELECT * FROM temp_user_view;
 sname  | sage
---------+-------
  张三丰 |   20
  李四娘 |   20

sql语句

sql审计日志保留

  • 保留 SQL审计日志:出于安全目的,将对表的所有查询记录到文件中
ALTER TABLE t EXPERIMENTAL_AUDIT SET READ WRITE;