创建表概述

最近更新时间: 2026-06-30 15:06:00

本文介绍如何通过 SQL 命令来创建表。
在 TDSQL PG 中,一个表是一系列二维数组的集合,用来代表和储存数据对象之间的关系。

前置条件

拥有CREATE权限才能创建表。

数据库表命名规范

创建表时,需要先为表命名,以下是定义表名时需要遵循的要求:

  • 在 TDSQL PG 数据库中,每个表的名称必须保证在 SCHEMA 内唯一。
  • 表名称不能超过 63 个字符(超过63个字符表名称会被截断,保留前63个字符)。
  • 建议给表起一个意义明确的名字,不要使用 t1table1 这样的表名。

创建表语法

使用CREATE TABLE语句创建表。CREATE TABLE将在当前数据库中创建一个新的、初始为空的表。该表将由执行该命令的用户所拥有。
语法如下:

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
] )
[ 
  DISTRIBUTE BY { REPLICATION | { [ SHARD ] ( column_name ) } }
]

参数说明:

  • TEMPORARY or TEMP
    如果指定,该表被创建为一个临时表。临时表会被在会话结束时自动被删除,或者也可以选择在当前事务结束时删除(见下文的ON COMMIT)。当临时表存在时,已有的同名持久表将对于当前会话不可见,不过可以使用模式限定的名称进行引用。在一个临时表上创建的任何索引也自动地变为临时的。自动清理守护进程不能访问并且因此也不能清理或分析临时表。由于这个原因,应该通过会话的 SQL 命令执行合适的清理和分析操作。例如,如果一个临时表将要被用于复杂的查询,最好在插入数据完成后在其上运行ANALYZE。
  • UNLOGGED
    如果指定,那么该表将不被日志记录,其中的数据不会写入到预写式日志中,也不会被复制到后备服务器中。表上创建的索引也默认不进行日志记录。这让它们比普通表快非常多。但是,该类型的表在数据库发生崩溃时,也不会被记录(在崩溃或非正常关闭之后会被自动地截断)。请谨慎使用。
  • IF NOT EXISTS
    表不存在时创建,当表存在时会给出提示。
  • table_name
    要被创建的表名(可以选择用schema限定)。
  • column_name
    要在新表中创建的一列的名称。
  • data_type
    该列的数据类型。这可以包括数组说明符。
  • COLLATE collation
    COLLATE子句为该列(必须是一种可排序数据类型)赋予一个排序规则。如果没有指定,将使用该列数据类型的默认排序规则。
  • column_constraint
    列级约束。
  • table_constraint
    表级约束。
  • DISTRIBUTE BY
    该子句指定表如何在 Datanode 之间分布或复制。
    • REPLICATION
      表的每一行都会被复制到TDSQL PG数据库集群的所有Datanode上。
    • SHARD ( column_name )
      指定shard key建表。表的每一行会根据shard key对应的值计算出shardid,然后再根据系统中的shardmap中存储的Datanode与shardid的映射关系,将数据存储到对应的Datanode中。

说明:

您可以使用 \dt 语句查看数据库中表的信息。