
# 单节点表DDL操作
#### 规格约束
1. 单节点表仅支持创建为复制表类型，不支持创建为分布表（指定分布列）。
2. 继承复制表约束：不支持创建全局二级索引（GSI），不支持定义为hash bucket表。
3. 仅支持在系统预置的单节点组Node Group上创建单节点表。
4. M-Compatibility模式数据库下不支持使用单节点表。
5. 从不支持单节点表的版本升级到新版本，升级观察期间，不支持默认创建单节点表。
6. 从不支持单节点表的版本升级到新版本，升级观察期间，新版本系统预置的单节点组Node Group上不允许进行创建表操作。
7. 当系统预置的单节点组Node Group上已创建单节点表，不支持对Node Group进行缩容。
8. 不支持物化视图、不支持外表。
9. 单节点表逻辑解码和备份恢复只支持同构场景，异构场景可能会导致错误。
10. 仅支持复制表基础上的本地临时表、unlogged表和全局临时表、一级分区表模式，其他表类型均不支持。
 
#### 创建单节点表
可通过以下方式进行创建单节点表，不同的创建方式需满足不同条件：
- 显式创建单节点表
  - 设置GUC参数single_node_table_strategy的值不为FORBID。
  
  - 在CREATE TABLE语句中，显式指定TO GROUP group_name子句，且指定的节点组为系统预定义的单节点组Node Group（类型标识为's'），其名称需以"sys_single_group"为前缀进行命名。如下所示：
    ```
    CREATE TABLE table1 (id INT) TO GROUP sys_single_group1;
    ```
    
   
- 隐式创建单节点表
  - 在CREATE TABLE语句中，未明确指定TO GROUP group_name子句时，系统自动选择一个类型为's'的节点组Node Group，其名称前缀为"sys_single_group"。
  
  - 设置GUC参数single_node_table_strategy：
    - 当设置为ALLOW_DEFAULT_NON_PART时，支持隐式创建非分区表类型的单节点表。
    
    - 当设置为ALLOW_DEFAULT_ALL，既支持隐式创建非分区表类型的单节点表，也支持隐式创建一级分区表类型的单节点表。
     
  
  - 待创建表归属的Schema具有单节点属性，具体请参见[设置Schema的单节点属性]相关描述。
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
GUC参数的具体使用请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 单节点表"章节。
语法示例：
```
-- 显式创建单节点表。
gaussdb=# CREATE TABLE single_table(a int) DISTRIBUTE BY REPLICATION TO GROUP sys_single_group1;
CREATE TABLE
gaussdb=# \d+ single_table
                          Table "public.single_table"
 Column |  Type   | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+---------+--------------+-------------
 a      | integer |           | plain   |              | 
Has OIDs: no
Distribute By: REPLICATION
Location Nodes: datanode1
Options: orientation=row, is_single_node=true, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off
-- 将GUC参数single_node_table_strategy设置为allow_default_all,详情请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。
-- 设置完成后，查看single_node_table_strategy的值是否为allow_default_all。
gaussdb=# SHOW single_node_table_strategy;
 single_node_table_strategy 
----------------------------
 allow_default_all
(1 row)
gaussdb=# CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
CREATE SCHEMA
-- 隐式创建单节点表。
gaussdb=# CREATE TABLE schema1.single_table1(a int);
CREATE TABLE
gaussdb=# \d+ schema1.single_table1
                            Table "schema1.single_table1"
 Column |  Type   | Modifiers | Storage | Stats target | Description 
--------+---------+-----------+---------+--------------+-------------
 a      | integer |           | plain   |              | 
Has OIDs: no
Distribute By: REPLICATION
Location Nodes: datanode1
Options: orientation=row, is_single_node=true, logical_repl_node=-1, compression=no, storage_type=USTORE, segment=off
gaussdb=# DROP TABLE single_table;
DROP TABLE
gaussdb=# DROP TABLE schema1.single_table1;
DROP TABLE
gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA
```
 #### 设置Schema的单节点属性
可通过以下方式进行设置Schema的单节点属性，不同的设置方式需满足不同条件：
- 显式设置Schema的单节点属性
  在CREATE SCHEMA语句中，显式指定SET NODE GROUP group_name子句，且指定的节点组为系统预定义的单节点组Node Group（类型标识为's'），其名称需以"sys_single_group"为前缀进行命名。如下所示：
  ```
  CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
  ```
  
- 隐式设置Schema的单节点
  - 在CREATE SCHEMA语句中，未明确指定SET NODE GROUP group_name子句时，系统自动选择一个类型为's'的节点组Node Group，其名称前缀为"sys_single_group"。
  
  - 在普通用户下创建具有单节点属性的Schema，不支持在初始用户、具有运维/安全等管理员权限的用户下隐式设置Schema的单节点属性。
  
  - 设置GUC参数default_nodegroup的值为SCHEMA。
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- GUC参数的具体使用请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 单节点表"章节。
- CREATE SCHEMA语法包含CREATE TABLE子句的复合SQL语句不支持单节点表相关功能，既不支持单节点表创建，也不支持模式设置单节点表属性。具体语法请参见《参考》中"SQL参考 \> SQL语法 \> C \> CREATE SCHEMA"章节。
 
语法示例：
```
-- 创建模式，显式设置单节点属性。
gaussdb=# CREATE SCHEMA schema1 SET NODE GROUP sys_single_group1;
CREATE SCHEMA
gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |       16389
(1 row)
gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA
gaussdb=# CREATE USER test_usr PASSWORD "********";
CREATE ROLE
gaussdb=# GRANT ALL ON DATABASE POSTGRES TO test_usr;
GRANT
-- 切换到test_usr用户。
-- 将GUC参数default_nodegroup设置为schema，详情请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 单节点表”章节。
-- 设置完成后，查看default_nodegroup的值是否为schema。
gaussdb=> SHOW default_nodegroup;
 default_nodegroup
----------------------------
 schema
(1 row)
-- 创建模式，隐式设置单节点属性。
gaussdb=> CREATE SCHEMA schema2;
CREATE SCHEMA
gaussdb=> SELECT * FROM pg_namespace WHERE nspname='schema2';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema2 |    16395 |           0 |        | n                 | f             |              |       16390
(1 row)
gaussdb=# DROP SCHEMA schema2 CASCADE;
DROP SCHEMA
```
#### 修改Schema的单节点属性
- 修改单节点属性需满足以下条件：
  在ALTER SCHEMA语句中，指定SET NODE GROUP group_name子句，且指定的节点组为系统预定义的单节点组Node Group（类型标识为's'），其名称需以"sys_single_group"为前缀进行命名。如下所示：
  ```
  ALTER SCHEMA schema1 SET NODE GROUP sys_single_group1;
  ```
  
- 删除单节点属性需满足以下条件： ALTER SCHEMA语法指定DROP NODE GROUP子句。
  
语法示例：
```
gaussdb=# CREATE SCHEMA schema1;
CREATE SCHEMA
gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |            
(1 row)
-- 修改Schema的单节点属性。
gaussdb=# ALTER SCHEMA schema1 SET NODE GROUP sys_single_group1;
ALTER SCHEMA
gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |       16389
(1 row)
-- 删除Schema的单节点属性。
gaussdb=# ALTER SCHEMA schema1 DROP NODE GROUP;
ALTER SCHEMA
gaussdb=# SELECT * FROM pg_namespace WHERE nspname='schema1';
 nspname | nspowner | nsptimeline | nspacl | in_redistribution | nspblockchain | nspcollation | nspgroupoid 
---------+----------+-------------+--------+-------------------+---------------+--------------+-------------
 schema1 |       10 |           0 |        | n                 | f             |              |            
(1 row)
gaussdb=# DROP SCHEMA schema1 CASCADE;
DROP SCHEMA
```
