CREATE TABLE
更新时间:2026-06-24
定义一个新表。
Note: 引用完整性语法(外键约束)被接受但未强制执行。
语法
SQL
1 CREATE [ [GLOBAL | LOCAL] {TEMPORARY | TEMP } | UNLOGGED] TABLE [IF NOT EXISTS]
2 table_name (
3 [ { column_name data_type [ COLLATE collation ] [column_constraint [ ... ] ]
4 [ ENCODING ( storage_directive [, ...] ) ]
5 | table_constraint
6 | LIKE source_table [ like_option ... ] }
7 | [ column_reference_storage_directive [, ...] ]
8 [, ... ]
9 ] )
10 [ INHERITS ( parent_table [, ... ] ) ]
11 [ WITH ( storage_parameter [=value] [, ... ] )
12 | WITHOUT OIDS ]
13 [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
14 [ TABLESPACE tablespace_name ]
15 [ DISTRIBUTED BY (column [opclass], [ ... ] )
16 | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED ]
17 [ PARTITION BY partition_type (column)
18 [ SUBPARTITION BY partition_type (column) ]
19 [ SUBPARTITION TEMPLATE ( template_spec ) ]
20 [...]
21 ( partition_spec )
22 | [ SUBPARTITION BY partition_type (column) ]
23 [...]
24 ( partition_spec
25 [ ( subpartition_spec
26 [(...)]
27 ) ]
28 ) ]
29 [ ORDER_COLUMNS ( column_name [, ... ] ) ]
30
31 CREATE [ [GLOBAL | LOCAL] {TEMPORARY | TEMP} | UNLOGGED ] TABLE [IF NOT EXISTS]
32 table_name
33 OF type_name [ (
34 { column_name WITH OPTIONS [ column_constraint [ ... ] ]
35 | table_constraint }
36 [, ... ]
37 ) ]
38 [ WITH ( storage_parameter [=value] [, ... ] ) | WITHOUT OIDS ]
39 [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
40 [ TABLESPACE tablespace_name ]
41 [ ORDER_COLUMNS ( column_name [, ... ] ) ]
42 ```
43
44 其中`column_constraint`是:
45
46 ``` sql
47 [ CONSTRAINT constraint_name]
48 { NOT NULL
49 | NULL
50 | CHECK ( expression ) [ NO INHERIT ]
51 | DEFAULT default_expr
52 | UNIQUE index_parameters
53 | PRIMARY KEY index_parameters
54 | REFERENCES reftable [ ( refcolumn ) ]
55 [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
56 [ ON DELETE key_action ] [ ON UPDATE key_action ] }
57 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
58 ```
59
60 `table_constraint`是:
61
62 ``` sql
63 [ CONSTRAINT constraint_name ]
64 { CHECK ( expression ) [ NO INHERIT ]
65 | UNIQUE ( column_name [, ... ] ) index_parameters
66 | PRIMARY KEY ( column_name [, ... ] ) index_parameters
67 | FOREIGN KEY ( column_name [, ... ] )
68 REFERENCES reftable [ ( refcolumn [, ... ] ) ]
69 [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
70 [ ON DELETE key_action ] [ ON UPDATE key_action ] }
71 [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
72 ```
73
74
75 *like_option*是:
76
77 ``` sql
78 {INCLUDING|EXCLUDING} {DEFAULTS|COMMENTS|CONSTRAINTS|GENERATED|IDENTITY|INDEXES|STATISTICS|STORAGE|COMMENTS|PARTITIONS|ALL}
79 ```
80
81
82 `UNIQUE`和`PRIMARY KEY`中的`index_parameters`约束为:
83
84 ``` sql
85 [ WITH ( storage_parameter [=value] [, ... ] ) ]
86 [ USING INDEX TABLESPACE tablespace_name ]
87 ```
88
89 列的`storage_directive`是:
90
91 ``` sql
92 compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE}
93 [compresslevel={0-9}]
94 [blocksize={8192-2097152} ]
95 ```
96
97 表的`storage_parameter`是:
98
99 ``` sql
100 appendonly={TRUE|FALSE}
101 blocksize={8192-2097152}
102 orientation={COLUMN|ROW}
103 checksum={TRUE|FALSE}
104 compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE}
105 compresslevel={0-9}
106 fillfactor={10-100}
107 oids[=TRUE|FALSE]
108 ```
109
110 `key_action`是:
111
112 ``` sql
113 ON DELETE
114 | ON UPDATE
115 | NO ACTION
116 | RESTRICT
117 | CASCADE
118 | SET NULL
119 | SET DEFAULT
120 ```
121
122 `partition_type`是:
123
124 ``` sql
125 LIST | RANGE
126 ```
127
128 `partition_specification`是:
129
130 ``` sql
131 partition_element [, ...]
132 ```
133
134 `partition_element`是:
135
136 ``` sql
137 DEFAULT PARTITION
138 name
139 | [PARTITION name] VALUES (list_value [,...] )
140 | [PARTITION name]
141 START ([datatype] 'start_value') [INCLUSIVE | EXCLUSIVE]
142 [ END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE] ]
143 [ EVERY ([datatype] [number |INTERVAL] 'interval_value') ]
144 | [PARTITION name]
145 END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE]
146 [ EVERY ([datatype] [number |INTERVAL] 'interval_value') ]
147 [ WITH ( partition_storage_parameter=value [, ... ] ) ]
148 [ column_reference_storage_directive [, ...] ]
149 [ TABLESPACE tablespace ]
150 ```
151
152 其中`subpartition_spec`或`template_spec`是:
153
154 ``` sql
155 subpartition_element [, ...]
156 ```
157
158 `subpartition_element`是:
159
160 ``` sql
161 DEFAULT SUBPARTITION name
162 | [SUBPARTITION name] VALUES (list_value [,...] )
163 | [SUBPARTITION name]
164 START ([datatype] 'start_value') [INCLUSIVE | EXCLUSIVE]
165 [ END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE] ]
166 [ EVERY ([datatype] [number |INTERVAL] 'interval_value') ]
167 | [SUBPARTITION name]
168 END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE]
169 [ EVERY ([datatype] [number |INTERVAL] 'interval_value') ]
170 [ WITH ( partition_storage_parameter=value [, ... ] ) ]
171 [ column_reference_storage_directive [, ...] ]
172 [ TABLESPACE tablespace ]
173 ```
174
175 其中分区的`storage_parameter`是:
176
177 ``` sql
178 appendonly={TRUE|FALSE}
179 blocksize={8192-2097152}
180 orientation={COLUMN|ROW}
181 checksum={TRUE|FALSE}
182 compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE}
183 compresslevel={1-19}
184 fillfactor={10-100}
185 oids[=TRUE|FALSE]
186 ```
187
188
189
190## 描述
191
192`CREATE TABLE`在当前数据库中创建一个最初为空的表。 执行命令的用户拥有该表。
193
194 为了能够创建表,您必须分别对所有列类型或`OF`子句中的类型具有`USAGE`权限。
195
196 如果指定模式名称,PalopgMPP将在指定的模式中创建表。 否则,PalopgMPP将在当前模式中创建表。临时表存在于特殊的模式中,因此在创建临时表时不能指定模式名称。
197
198 表名称必须与同一模式中的任何其他表,外部表,序列,索引,视图或外部表的名称不同。
199
200 `CREATE TABLE`还会自动创建一个数据类型,该数据类型表示与表的一行相对应的复合类型。因此,表不能与同一模式中的任何现有数据类型具有相同的名称。
201
202 可选的约束子句指定新行或更新行必须满足的条件才能成功执行插入或更新操作。 约束是一个SQL对象,可以通过多种方式帮助定义表中的有效值集。约束适用于表,而不适用于分区。 您不能将约束添加到分区或子分区。
203
204 引用完整性约束(外键)被接受但不强制执行。 该信息保留在系统catalog中,否则将被忽略。
205
206 有两种定义约束的方法:表约束和列约束。 列约束被定义为列定义的一部分。 表约束定义不与特定列绑定,并且可以包含多个列。每个列约束也可以写为表约束。 当约束仅影响一列时,使用列约束只是一种符号上的方便。
207
208 创建表时,还有一个附加子句来声明PalopgMPP数据库分发策略。 如果未提供`DISTRIBUTED BY`,`DISTRIBUTED RANDOMLY`或`DISTRIBUTED REPLICATED`子句, 则PalopgMPP数据库将通过使用`PRIMARY KEY`(如果表具有一个)或表的第一列作为分发键,向该表分配哈希分发策略。几何或用户定义数据类型的列不符合PalopgMPP分布键列的要求。
209
210 如果表中没有符合条件的数据类型的列,则将根据轮询或随机分布来分配行。 为了确保数据在PalopgMPP数据库系统中的均匀分配,希望选择一个对于每个记录都是唯一的分配键,或者如果不可能,则选择`DISTRIBUTED RANDOMLY`。
211
212 如果提供了`DISTRIBUTED REPLICATED`子句,则PalopgMPP数据库会将表的所有行分配给PalopgMPP数据库系统中的所有executor。
213
214 如果用户定义的函数必须在executor上执行,并且这些函数需要访问表的所有行,则可以使用此选项。 复制函数还可以用于防止表的broadcast motions,从而提高查询性能。 `DISTRIBUTED REPLICATED`子句不能与`PARTITION BY`子句或`INHERITS`子句一起使用。 复制的表也不能被另一个表继承。
215
216 隐藏的系统列(`rowid`,`ctid`,`cmin`,`cmax`,`xmin`,`xmax`和`sc_dbindex_id`)无法在复制表的用户查询中引用,因为它们没有单一的,无歧义的值。
217
218 通过`PARTITION BY`子句,您可以将表分为多个子表(或部分),这些子表一起构成父表并共享其模式。尽管子表作为独立表存在,但是PalopgMPP数据库以重要方式限制了它们的使用。在内部,分区被实现为继承的一种特殊形式。每个子表分区都是根据不同的`CHECK`约束创建的,该约束根据一些定义条件限制表可以包含的数据。
219
220 查询优化器还使用`CHECK`约束来确定要扫描哪些表分区以满足给定的查询谓词。 这些分区约束由PalopgMPP数据库自动管理。
221
222
223
224## 参数
225
226该SQL命令参数说明见下
227
228 `GLOBAL` \| `LOCAL`
229 : 提供这些关键字是为了实现SQL标准兼容性,但在PalopgMPP数据库中无效,并且已弃用。
230
231 `TEMPORARY` \| `TEMP`
232 : 如果指定,该表将被创建为临时表。 临时表在会话结束时或在当前事务结束时自动删除(请参见`ON COMMIT`)。临时表存在时,具有相同名称的现有永久表在当前会话中不可见,除非使用模式限定名称引用它们。在临时表上创建的所有索引也会自动成为临时索引。
233
234 `UNLOGGED`
235 : 如果指定,该表将创建为未记录表。 写入未记录表的数据不会写入预写(WAL)日志,这使它们比普通表快得多。但是,未记录表的内容不会复制到mirror实例。同样,未记录的表也不是崩溃安全的。executor实例崩溃或异常关闭后,该executor上未记录表的数据将被截断。在未记录表上创建的所有索引也会自动成为未记录索引。
236
237 `table_name`
238 : 要创建的新表的名称(可以由模式指定)。
239
240 `OF type_name`
241 : 创建一个类型化的表,该表从指定的组合类型(名称可以由模式指定)获取其结构。 类型化的表与其类型相关联。例如,如果删除了类型(使用`DROP TYPE ... CASCADE`),则将删除该表。
242
243 当一个类型化的表被创建时,列的数据类型由底层的组合类型决定而没有在`CREATE TABLE`命令中直接指定。 但是`CREATE TABLE`命令可以对表增加默认值和约束,并且可以指定存储参数。
244
245 `column_name`
246 : 要在新表中创建的列的名称。
247
248 `data_type`
249 : 列的数据类型。这可能包括数组说明符。对于包含文本数据的表列,请指定数据类型`VARCHAR`或`TEXT`。 不建议指定数据类型`CHAR`。
250
251 在PalopgMPP数据库中,数据类型`VARCHAR`或`TEXT`处理作为有效字符添加到数据(在最后一个非空格字符之后添加的空格字符)的填充,而数据类型`CHAR`不处理。
252
253 `COLLATE collation`
254 : `COLLATE`子句为该列分配排序规则(该排序规则必须是可排序的数据类型)。 如果未指定,则使用列数据类型的默认排序规则。
255
256 `DEFAULT default_expr`
257 : `DEFAULT`子句为出现在其列定义中的列分配默认数据值。
258 该值是任何不带变量的表达式(不允许对当前表中的其他列进行子查询和交叉引用)。
259
260 默认表达式的数据类型必须与列的数据类型匹配。 默认表达式将在未为列指定值的任何插入操作中使用。 如果列没有默认值,则默认值为null。
261
262 `ENCODING ( storage_directive \[, ...\] )`
263 : 对于列,可选的`ENCODING`子句指定列数据的压缩类型和块大小。
264
265 该子句仅对列存表有效。
266
267 列压缩设置从表级别继承到分区级别再到子分区级别。 最低级别的设置具有优先权。
268
269 `INHERITS ( parent_table \[, …\])`
270 : 可选的`INHERITS`子句指定一个表列表,新表将从中自动继承所有列。 使用`INHERITS`将在新的子表及其父表之间创建持久关系。对父级的模式修改通常也会传播到子级,默认情况下,子级表的数据包含在父级扫描中。在PalopgMPP数据库中,创建分区表时不使用`INHERITS`子句。
271
272 尽管在分区层次结构中使用了继承的概念,但是使用`PARTITION BY`子句创建了分区表的继承结构。如果一个以上的父表中存在相同的列名,则将报告错误,除非每个父表中的列的数据类型都匹配。
273
274 如果没有冲突,则将重复的列合并以在新表中形成一个列。如果新表的列名列表包含一个也被继承的列名,则数据类型必须同样与继承的列匹配,并且列定义将合并为一个。
275
276 如果新表显式指定了该列的默认值,则该默认值将覆盖该列的继承声明中的所有默认值。否则,为该列指定默认值的所有父项都必须指定相同的默认值,否则将报告错误。
277
278 `CHECK`约束基本上以与列相同的方式合并:如果多个父表或新表定义包含名称相同的约束,则这些约束必须全部具有相同的校验表达式,否则将报告错误。具有相同名称和表达式的约束将合并为一个副本。 不会考虑在父级中标记为`NO INHERIT`的约束。请注意,新表中未命名的`CHECK`约束将永远不会被合并,因为将始终为其选择唯一的名称。
279
280 列`STORAGE`设置也会从父表中复制。
281
282 `LIKE source_table [like_option ...\]`
283 : `LIKE`子句指定一个表,新表将从该表中自动复制所有列名,其数据类型,非空约束和分发策略。不会复制诸如列存或分区结构之类的存储属性。与`INHERITS`不同,新表和原始表在创建完成后完全解耦。
284
285 仅当指定`INCLUDING DEFAULTS`时,才会复制复制的列定义的默认表达式。默认行为是排除默认表达式,导致新表中复制的列具有空默认值。
286
287 非空约束始终会复制到新表中。 仅当指定`INCLUDING CONSTRAINTS`时,才会复制`CHECK`约束。列约束和表约束之间没有区别。
288
289 仅在指定`INCLUDING INDEXES`子句的情况下,才会在新表上创建原始表的索引, `PRIMARY KEY`和`UNIQUE`约束。 不论原始名称如何命名,都会根据默认规则选择新索引和约束的名称。(此行为避免了新索引可能出现的重复名称错误。)除非指定了`INCLUDING INDEXES`子句,否则不会在新表上创建原始表上的任何索引。
290
291 仅当指定了`INCLUDING STORAGE`时,才会复制复制的列定义的`STORAGE`设置。默认行为是排除`STORAGE`设置,导致新表中复制的列具有特定于类型的默认设置。
292
293 仅当指定`INCLUDING COMMENTS`时,才会复制复制的列,约束和索引的注释。默认行为是排除注释,导致新表中复制的列和约束没有注释。
294
295 `INCLUDING ALL` 是 `INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS`的缩写形式. 请注意,与`INHERITS`不同,`LIKE`复制的列和约束不会与名称相似的列和约束合并。
296
297 如果显式指定了相同的名称,或者在另一个`LIKE`子句中指定了相同的名称,则将指示错误。`LIKE`子句还可用于从视图,外部表或复合类型中复制列。 不适用的选项(例如,从视图`INCLUDING INDEXES`)将被忽略。
298
299 `CONSTRAINT constraint_name`
300 : 列或表约束的可选名称。
301
302 如果违反了约束,那么约束名称将出现在错误消息中,因此可以使用约束名称(例如列必须为正)来将有用的约束信息传达给客户端应用程序。(需要双引号指定包含空格的约束名称。)如果未指定约束名称,则系统将生成一个名称。
303
304 注意: 指定的`constraint_name`用于约束,但系统生成的唯一名称用于索引名。在某些以前的版本中,提供的名称同时用于约束名称和索引名称。
305
306
307 `NULL` \| `NOT NULL`
308 : 指定是否允许该列包含空值。默认值为`NULL`。
309
310 `CHECK (expression) \[ NO INHERIT \] `
311 : `CHECK`子句指定一个生成布尔结果的表达式,新的或更新的行必须满足才能使插入或更新操作成功。计算为`TRUE`或`UNKNOWN`的表达式会成功。
312
313 如果插入或更新操作的任何行都产生`FALSE`结果,则会引发错误异常,并且插入或更新不会更改数据库。指定为列约束的检查约束应仅引用该列的值,而出现在表约束中的表达式可以引用多个列。
314
315 标有`NO INHERIT`的约束不会传播到子表。当前,`CHECK`表达式不能包含子查询,也不能引用当前行的列以外的变量。
316
317 `UNIQUE ( column_constraint ) `\| `UNIQUE ( column_name \[, ... \] ) ( table_constraint )`
318 : `UNIQUE`约束指定表的一组一个或多个列只能包含唯一值。 唯一表约束的行为与列约束的行为相同,但具有跨多个列的附加功能。出于唯一约束的目的,空值不视为相等。 唯一的列必须包含PalopgMPP分布键的所有列。此外,如果表已分区,则`<key>`必须包含分区键中的所有列。
319 请注意,分区表中的`<key>`约束与简单的`UNIQUE INDEX`不同。
320
321 PRIMARY KEY ( `column constraint` ) \| PRIMARY KEY ( `column_name` \[, ... \] ) ( ` table constraint ` )
322 : `PRIMARY KEY`约束指定表的一列或多列只能包含唯一(非重复),非null值。
323
324 只能为一个表指定一个主键,无论是作为列约束还是表约束。要使一个表具有主键,它必须是哈希分布的(不是随机分布的),并且主键(唯一的列)必须包含PalopgMPP分布键的所有列。
325
326 此外,如果表已分区,则`<key>`必须包含分区键中的所有列。
327
328 请注意,分区表中的`<key>`约束与简单的`UNIQUE INDEX`不同。
329
330 `PRIMARY KEY`强制执行与`UNIQUE`和`NOT NULL`相同的组合数据约束,但是将一组列标识为主键也可以提供有关模式设计的元数据,因为主键标识其他表可以依赖这一个列集合作为行的唯一标识符。
331
332
333 REFERENCES `reftable` \[ ( `refcolumn` ) \] \[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE \] \[ON DELETE \| ON UPDATE\] \[`key_action`\] FOREIGN KEY (`column_name` \[, ...\])
334 : `REFERENCES`和`FOREIGN KEY`子句指定引用完整性约束(外键约束)。
335
336
337 `DEFERRABLE` \| `NOT DEFERRABLE`
338 : `[NOT] DEFERRABLE`子句控制约束是否可以被推迟。 一个不可推迟的约束将在每个命令后立即进行检查。
339 可以推迟检查约束,直到事务结束(使用[`SET CONSTRAINTS`]命令)。 默认值是`NOT DEFERRABLE`。
340
341 当前,只有`UNIQUE`和`PRIMARY KEY`约束是可推迟的。 `NOT NULL`和`CHECK`约束不可延迟。
342
343 `REFERENCES`(外键)约束接受此子句,但不强制执行。
344
345 `INITIALLY IMMEDIATE` \| `INITIALLY DEFERRED`
346 : 如果约束是可延迟的,则此子句指定检查约束的默认时间。 如果该约束是`INITIALLY IMMEDIATE`,则在每个语句之后对其进行检查。 这是默认值。
347
348 如果约束是`INITIALLY DEFERRED`,则仅在事务结束时进行检查。 可以使用`SET CONSTRAINTS`命令更改约束检查时间。
349
350 `WITH (storage_parameter=value) `
351 : `WITH`子句可以为表以及与`UNIQUE`或`PRIMARY`约束关联的索引指定存储参数。
352
353 请注意,还可以通过在分区规范中声明`WITH`子句来在特定分区或子分区上设置存储参数。最低级别的设置具有优先权。
354
355 某些表存储选项的默认值可以使用服务器配置参数`sc_default_storage_options`指定。
356
357 可以使用以下存储选项:
358
359 * **appendonly** — 设置为`TRUE`可将表创建为列存的表(需与orientation或compresstype联合使用)。如果为`FALSE`或未声明,则将表创建为常规堆存储表。非必须参数,只是为了兼容旧版本。
360
361 * **blocksize** — 设置为表中每个块的大小(以字节为单位)。`blocksize`必须介于8192和2097152字节之间,并且是8192的倍数。默认值为32768。
362
363 * **orientation** — 设置为`column`以用于列式存储。
364
365 * **checksum** — 此选项仅对列存表有效。值`TRUE`是默认值,并为列存表启用CRC校验和验证。校验和是在块创建期间计算的,并存储在磁盘上。在块读取期间执行校验和验证。 如果在读取期间计算出的校验和与存储的校验和不匹配,则事务中止。如果将值设置为`FALSE`以禁用校验和验证,将不会执行检查表数据是否存在磁盘损坏的操作。
366
367 * **compresstype** — 设置为`ZLIB`(默认值),`ZSTD`,`RLE_TYPE`或`QUICKLZ`以指定使用的压缩类型。值`NONE`禁用压缩。 Zstd提供速度或良好的压缩率,可通过`compresslevel`选项进行调整。提供QuickLZ和zlib是为了向后兼容。 在通常的工作负载上,Zstd的性能优于这些压缩类型。当相同的数据值出现在许多连续的行中时,RLE的压缩数据比Zstd,zlib或QuickLZ压缩算法更好。对于`BIGINT`,`INTEGER`,`DATE`,`TIME`或`TIMESTAMP`类型的列,如果将`compresstype`选项设置为`RLE_TYPE`压缩,则还将应用增量压缩。增量压缩算法基于连续行中列值之间的增量,旨在改善按排序顺序加载数据或将压缩应用于按排序顺序的列数据时的压缩。
368
369 * **compresslevel** — 对于列存表的Zstd压缩,请将其设置为1(最快压缩)到19(最高压缩率)之间的整数值。对于zlib压缩,有效范围是1到9。QuickLZ压缩级别只能设置为1。 如果未声明,则默认值为1。对于`RLE_TYPE`,压缩级别可以是1(最快压缩)到4(最高压缩率)之间的整数值。当`orientation`=`column`或指定compresstype时,`compresslevel`选项才有效。
370
371 * **fillfactor** — 有关此索引存储参数的更多信息,请参见`CREATE INDEX`。
372
373 * **oids** — 设置为`oids=FALSE`(默认值),以便不为行分配对象标识符。强烈建议在创建表时不要启用OIDS。在大型表上(例如典型的PalopgMPP数据库系统中的表),对表行使用OID可能会导致32位OID计数器的折回。一旦计数器回绕,就不能再认为OID是唯一的,这不仅使它们对用户应用程序无用,而且还会在PalopgMPP数据库系统catalog表中引起问题。此外,从表中排除OID会使表每行存储在磁盘上所需的空间减少了每行4个字节,从而略微提高了性能。分区表或列存表上不允许使用OIDS。
374
375 `WITHOUT OIDS`
376 : 等同于`WITH (OIDS=FALSE)`的过时语法。
377
378 如果希望同时提供OIDS设置和存储参数,则必须使用`WITH ( ... )`语法,如上一个参数说明所示。 `WITH OIDS`将不再支持。
379
380
381 `ON COMMIT`
382 : 可以使用`ON COMMIT`控制事务块末尾的临时表的行为。 这三个选项是:
383
384 * **PRESERVE ROWS** - 临时表的事务结束时不会采取任何特殊操作。这是默认行为。
385
386 * **DELETE ROWS** - 临时表中的所有行将在每个事务块的末尾删除。 本质上,每次提交都会自动执行一次`TRUNCATE`。
387
388 * **DROP** - 临时表将在当前事务块的末尾删除。
389
390 `TABLESPACE tablespace`
391 : 要在其中创建新表的表空间的名称。如果未指定,则使用数据库的默认表空间。
392
393 `USING INDEX TABLESPACE tablespace`
394 : 该子句允许选择将在其中创建与`UNIQUE`或`PRIMARY KEY`约束关联的索引的表空间。 如果未指定,则使用数据库的默认表空间。
395
396 `DISTRIBUTED BY (column \[opclass\], \[ ... \] )` \| `DISTRIBUTED RANDOMLY` \| `DISTRIBUTED REPLICATED`
397 : 用于声明表的PalopgMPP数据库分布策略。 `DISTRIBUTED BY`使用具有一个或多个声明为分布键的列的哈希分布。为了获得最均匀的数据分配,分布键应为表的主键或唯一列(或一组列)。
398
399 如果无法做到这一点,则可以选择`DISTRIBUTED RANDOMLY`,它将数据轮询发送到executor实例。 此外,可以指定运算符类`opclass`,以使用非默认哈希函数。
400
401 如果在创建表时未指定DISTRIBUTED BY子句,则PalopgMPP数据库服务器配置参数`sc_create_table_random_default_distribution`将控制表默认分布策略。
402
403 如果未指定分布策略,PalopgMPP数据库将遵循以下规则来创建表
404
405 * 如果参数的值是`off`(默认值),则PalopgMPP数据库根据以下命令选择表分布键:
406
407 - 如果指定了`LIKE`或`INHERITS`子句,则PalopgMPP从源表或父表复制分布键。
408
409 - 如果指定了`PRIMARY KEY`或`UNIQUE`约束,则PalopgMPP选择所有键列中最大的子集作为分布键。
410
411 - 如果既未指定约束,也未指定`LIKE`或`INHERITS`子句,则PalopgMPP选择第一个合适的列作为分布键。(具有几何或用户定义数据类型的列不符合作为PalopgMPP分布键列的条件。)
412
413 * 如果参数的值设置为`on`,则PalopgMPP数据库遵循以下规则:
414
415 - 如果未指定PRIMARY KEY或UNIQUE列,则表的分布是随机的(DISTRIBUTED RANDOMLY)。即使表创建命令包含LIKE或INHERITS子句,表分布也是随机的。
416
417 - 如果指定了PRIMARY KEY或UNIQUE列,则还必须指定DISTRIBUTED BY子句。如果在表创建命令中未指定DISTRIBUTED BY子句,则该命令将失败。
418
419 有关设置默认表分布策略的更多信息,请参见
420 [`sc_create_table_random_default_distribution`]配置参数说明。
421
422 `DISTRIBUTED REPLICATED`子句将整个表复制到所有PalopgMPP数据库executor实例。
423
424 当函数需要访问表中的所有行或需要通过阻止broadcast motion来提高查询性能时,必须在executor上执行用户定义的函数时可以使用它。
425
426 `PARTITION BY`
427 : 声明用于对表进行分区的一列或多列。建分区表时,PalopgMPP数据库使用指定的表名创建根分区表(根分区)。
428
429 PalopgMPP数据库还会根据您指定的分区选项创建表,子表的层次结构,这些表是子分区。PalopgMPP数据库*pg_partition*\*系统视图包含有关子分区表的信息。
430
431 对于每个分区级别(表的每个层次结构级别),一个分区表最多可以有32,767个分区。
432
433 注意:PalopgMPP数据库将分区表数据存储在叶子表中,叶子表是子表层次结构中的最低级表,供分区表使用。
434
435 `partition_type`
436 : 声明分区类型:`LIST`(值列表)或`RANGE`(数字或日期范围)。
437 `partition_specification`
438 : 声明要创建的各个分区。
439
440 可以单独定义每个分区,或者对于范围分区,可以使用`EVERY`子句(带有`START`和可选`END`子句)来定义用于创建单个分区的增量模式。
441
442 * **` DEFAULT PARTITION name `** — 声明默认分区。当数据与现有分区不匹配时,会将其插入默认分区。没有默认分区的分区设计将拒绝与现有分区不匹配的传入行。
443
444 * **` PARTITION name `** — 声明要用于分区的名称。使用以下命名约定创建分区:`parentname_level#_prt_givenname`。
445
446 * **`VALUES`** — 对于列表分区,定义分区将包含的值。
447
448 * **`START`** — 对于范围分区,定义分区的起始范围值。 默认情况下,起始值为`INCLUSIVE`。例如,如果您声明开始日期为'`2016-01-01`',则分区将包含所有大于或等于'`2016-01-01`'的日期。通常,`START`表达式的数据类型与分区键列的类型相同。 如果不是这种情况,则必须显式转换为预期的数据类型。
449
450 * **`END`** — 对于范围分区,定义分区的结束范围值。 默认情况下,结束值为`EXCLUSIVE`。例如,如果您声明结束日期为'`2016-02-01`',则分区将包含所有小于但不等于'`2016-02-01`'的日期。通常,`END`表达式的数据类型与分区键列的类型相同。 如果不是这种情况,则必须显式转换为预期的数据类型。
451
452 * **`EVERY`** — 对于范围分区,定义如何将值从`START`递增到`END`以创建单个分区。通常,`EVERY`表达式的数据类型与分区键列的类型相同。如果不是这种情况,则必须显式转换为预期的数据类型。
453
454 * **`WITH`** — 设置分区的表存储选项。 例如,您可能希望将较旧的分区作为列存表,而将较新的分区作为常规堆表。
455
456 * **`TABLESPACE`** — 要在其中创建分区的表空间的名称。
457
458 `SUBPARTITION BY`
459 : 声明用于对表的第一级分区进行子分区的一个或多个列。 子分区的规范格式类似于上述分区的规范格式。
460
461 `SUBPARTITION TEMPLATE`
462 : 可以选择声明一个用于创建子分区的子分区模板(低级别子表),而不是为每个分区分别声明每个子分区定义。然后,此子分区规范将应用于所有父分区。
463
464 `ORDER_COLUMNS ( column_name [, ... ] )`
465 : `ORDER_COLUMNS` 指定表的一列或多列作为排序列,最多可以指定8个排序列,排序列不能重复。目前只支持列存表进行指定,分区表主表指定可为所有列存子表指定。
466
467
468
469注解
470: 创建表须注意以下几点:
471 - 在PalopgMPP数据库(基于Palopg的系统)中,数据类型`VARCHAR`或`TEXT`处理填充作为有效字符添加到文本的数据(最后一个非空格字符之后添加空格字符);数据类型`CHAR`则没有。
472
473 在PalopgMPP数据库中,`CHAR(n)`类型的值用尾随空格填充到指定的宽度`n`。 值将存储并显示为空格。但是,填充空格在语义上无关紧要。 分配值时,将忽略尾随空格。比较数据类型`CHAR`的两个值时,尾随空格在语义上也无关紧要,而将字符值转换为其他字符串类型之一时,尾随空格也将被删除。
474
475 - 不建议在新应用程序中使用OID:在可能的情况下,最好使用`SERIAL`或其他序列生成器作为表的主键。但是,如果应用程序确实使用OID来标识表的特定行,则建议在该表的OID列上创建唯一约束,以确保即使在计数器回绕后,表中的OID的确可以唯一地标识行。避免假设OID在表之间是唯一的;如果需要数据库范围的唯一标识符,则可以使用表OID和行OID的组合。
476
477 - PalopgMPP数据库对于主键和作为PalopgMPP表中的分布键的列的唯一约束具有一些特殊条件。
478
479 为了在PalopgMPP数据库中实施唯一约束,表必须是哈希分布的(不是`DISTRIBUTED RANDOMLY`), 并且约束列必须与表的分布键列相同(或作为其的超集)。 另外,分布键必须是约束列的左子集,并且列的顺序正确。例如,如果主键是(a,b,c),则分布键只能是以下之一:(a),(a,b)或(a,b,c)。
480
481 复制表(`DISTRIBUTED REPLICATED`)可以同时具有`PRIMARY KEY`和`UNIQUE`列约束。
482
483 主键约束只是唯一约束和非空约束的组合。
484
485 PalopgMPP数据库自动为每个`UNIQUE`或`PRIMARY KEY`约束创建一个`UNIQUE`索引,以强制执行唯一性。因此,没有必要为主键列显式创建索引。
486
487 PalopgMPP数据库中不支持外键约束。
488
489 对于继承的表,当前实现中不会继承唯一约束,主键约束,索引和表权限。
490
491 - 对于列存表,可重复读或可序列化事务中不允许`UPDATE`和`DELETE`,这将导致事务中止。 `CLUSTER`,`DECLARE...FOR UPDATE`和触发器不支持列存表。
492
493 - 要将数据插入分区表中,请指定根分区表,即使用`CREATE TABLE`命令创建的表。还可以在`INSERT`命令中指定分区表的叶子表。
494
495 如果数据对于指定的叶子表无效,则返回错误。 不支持在`INSERT`命令中指定不是叶子表的子表。
496
497 不支持在分区表的任何子表上执行其他DML命令,例如`UPDATE`和`DELETE`。这些命令必须在根分区表(使用`CREATE TABLE`命令创建的表)上执行。
498
499 - 可以使用服务器配置参数`sc_default_storage_option`指定这些表存储选项的默认值。
500
501
502 * appendonly
503
504 * blocksize
505
506 * checksum
507
508 * compresstype
509
510 * compresslevel
511
512 * orientation
513
514 可以为系统,数据库或用户设置默认值。有关设置存储选项的信息,请参阅服务器配置参数`sc_default_storage_options`。
515
516
517 * 注意:当前的PalopgMPP数据库Palopg优化器允许使用具有多列(复合)分区键的列表分区。
518
519
520
521
522
523## 示例
524
525在名为`baby`的模式中创建一个名为`rank`的表, 并使用`rank`,`gender`和`year`列分发数据:
526
527 ``` sql
528 CREATE TABLE baby.rank (id int, rank int, year smallint,
529 gender char(1), count int ) DISTRIBUTED BY (rank, gender,
530 year);
531 ```
532
533 创建表files和表分配器(默认情况下,主键将用作PalopgMPP分布键):
534
535 ``` sql
536 CREATE TABLE films (
537 code char(5) CONSTRAINT firstkey PRIMARY KEY,
538 title varchar(40) NOT NULL,
539 did integer NOT NULL,
540 date_prod date,
541 kind varchar(10),
542 len interval hour to minute
543 );
544
545 CREATE TABLE distributors (
546 did integer PRIMARY KEY DEFAULT nextval('serial'),
547 name varchar(40) NOT NULL CHECK (name <> '')
548 );
549 ```
550
551 创建一个gzip压缩的,列存表:
552
553 ``` sql
554 CREATE TABLE sales (txn_id int, qty int, date date)
555 WITH (orientation = column, compresslevel=5)
556 DISTRIBUTED BY (txn_id);
557 ```
558
559 使用子分区模板和每个级别的默认分区创建一个三级分区表:
560
561 ``` sql
562 CREATE TABLE sales (id int, year int, month int, day int,
563 region text)
564 DISTRIBUTED BY (id)
565 PARTITION BY RANGE (year)
566
567 SUBPARTITION BY RANGE (month)
568 SUBPARTITION TEMPLATE (
569 START (1) END (13) EVERY (1),
570 DEFAULT SUBPARTITION other_months )
571
572 SUBPARTITION BY LIST (region)
573 SUBPARTITION TEMPLATE (
574 SUBPARTITION usa VALUES ('usa'),
575 SUBPARTITION europe VALUES ('europe'),
576 SUBPARTITION asia VALUES ('asia'),
577 DEFAULT SUBPARTITION other_regions)
578
579 ( START (2008) END (2016) EVERY (1),
580 DEFAULT PARTITION outlying_years);
581 ```
582
583
584
585兼容性说明
586: `CREATE TABLE`命令符合SQL标准,但以下情况除外:
587
588 - **Temporary Tables** — 在SQL标准中,临时表仅定义一次,并在每个需要它们的会话中自动存在(从空内容开始)。相反,PalopgMPP数据库要求每个会话为要使用的每个临时表发出自己的`CREATE TEMPORARY TABLE`命令。这允许不同的会话出于不同的目的而使用相同的临时表名称,而标准的方法将给定临时表名称的所有实例约束为具有相同的表结构。
589
590 全局和本地临时表之间的标准区别不在PalopgMPP数据库中。PalopgMPP数据库将在临时表声明中接受`GLOBAL`和`LOCAL`关键字,但它们无效且已弃用。
591
592 如果省略`ON COMMIT`子句,则SQL标准将默认行为指定为`ON COMMIT DELETE ROWS`。但是,PalopgMPP数据库中的默认行为是`ON COMMIT PRESERVE ROWS`。 SQL标准中不存在`ON COMMIT DROP`选项。
593
594 - **Column Check Constraints** — SQL标准说,`CHECK`列约束只能引用它们所适用的列。 只有`CHECK`表约束可以引用多个列。PalopgMPP数据库不强制执行此限制;它对待列和表检查约束都一样。
595
596 - **NULL Constraint** — `NULL`约束是对SQL标准的PalopgMPP数据库扩展,为了与某些其他数据库系统兼容(以及对称的`NOT NULL`约束)。 由于它是任何列的默认值,因此不需要它的存在。
597
598 - **Inheritance** — 通过`INHERITS`子句的多重继承是PalopgMPP数据库语言的扩展。SQL:1999及更高版本使用不同的语法和语义定义了单个继承。PalopgMPP数据库尚不支持SQL:1999样式的继承。
599
600 - **Partitioning** — 通过`PARTITION BY`子句进行的表分区是PalopgMPP数据库语言的扩展。
601
602 - **Zero-column tables** — PalopgMPP数据库允许创建不包含任何列的表(例如`CREATE TABLE foo();`)。这是SQL标准的扩展,不允许使用零列表。 零列表本身并没有什么用,但是不允许使用零列表在`ALTER TABLE DROP COLUMN`时会产生奇怪的特殊情况, 因此PalopgMPP决定忽略此规范限制。
603
604 - **LIKE** — 尽管SQL标准中存在`LIKE`子句,但PalopgMPP数据库接受的许多选项都不在该标准中,并且PalopgMPP数据库并未实现该标准的某些选项。
605
606 - **WITH clause** — `WITH`子句是PalopgMPP数据库扩展。 存储参数和OID都不在标准中。
607
608 - **Tablespaces** — 表空间的PalopgMPP数据库概念不是SQL标准的一部分。子句`TABLESPACE`和`USING INDEX TABLESPACE`是扩展。
609
610 - **Data Distribution** — 并行或分布式数据库的PalopgMPP数据库概念不是SQL标准的一部分。`DISTRIBUTED`子句是扩展。
611
612
613
614相关SQL命令
615: ` ALTER TABLE ` , ` DROP TABLE ` , ` CREATE EXTERNAL TABLE ` , ` CREATE TABLE AS `
评价此篇文章
