ALTER TABLE
更新时间:2026-06-25
ALTER TABLE
更改表的定义。
语法
SQL
1 ALTER TABLE [IF EXISTS] [ONLY] name
2 action [, ... ]
3
4 ALTER TABLE [IF EXISTS] [ONLY] name
5 RENAME [COLUMN] column_name TO new_column_name
6
7 ALTER TABLE [ IF EXISTS ] [ ONLY ] name
8 RENAME CONSTRAINT constraint_name TO new_constraint_name
9
10 ALTER TABLE [IF EXISTS] name
11 RENAME TO new_name
12
13 ALTER TABLE [IF EXISTS] name
14 SET SCHEMA new_schema
15
16 ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
17 SET TABLESPACE new_tablespace [ NOWAIT ]
18
19 ALTER TABLE [IF EXISTS] [ONLY] name SET
20 WITH (REORGANIZE=true|false)
21 | DISTRIBUTED BY ({column_name [opclass]} [, ... ] )
22 | DISTRIBUTED RANDOMLY
23 | DISTRIBUTED REPLICATED
24
25 ALTER TABLE name
26 [ ALTER PARTITION { partition_name | FOR (value) } partition_action [...] ]
27 partition_action
28
29 其中关键字action 是下列之一:
30
31 ADD [COLUMN] column_name data_type [ DEFAULT default_expr ]
32 [column_constraint [ ... ]]
33 [ COLLATE collation ]
34 [ ENCODING ( storage_directive [,...] ) ]
35 DROP [COLUMN] [IF EXISTS] column_name [RESTRICT | CASCADE]
36 ALTER [COLUMN] column_name [ SET DATA ] TYPE type [COLLATE collation] [USING expression]
37 ALTER [COLUMN] column_name SET DEFAULT expression
38 ALTER [COLUMN] column_name DROP DEFAULT
39 ALTER [COLUMN] column_name { SET | DROP } NOT NULL
40 ALTER [COLUMN] column_name SET STATISTICS integer
41 ALTER [COLUMN] column SET ( attribute_option = value [, ... ] )
42 ALTER [COLUMN] column RESET ( attribute_option [, ... ] )
43 ADD table_constraint [NOT VALID]
44 ADD table_constraint_using_index
45 VALIDATE CONSTRAINT constraint_name
46 DISABLE CONSTRAINT constraint_name
47 ENABLE CONSTRAINT constraint_name
48 DROP CONSTRAINT [IF EXISTS] constraint_name [RESTRICT | CASCADE]
49 DISABLE TRIGGER [trigger_name | ALL | USER]
50 ENABLE TRIGGER [trigger_name | ALL | USER]
51 CLUSTER ON index_name
52 SET WITHOUT CLUSTER
53 SET WITHOUT OIDS
54 SET (storage_parameter = value)
55 RESET (storage_parameter [, ... ])
56 INHERIT parent_table
57 NO INHERIT parent_table
58 OF type_name
59 NOT OF
60 OWNER TO new_owner
61 SET TABLESPACE new_tablespace
62 ADD ORDER_COLUMNS ( column_name [, ... ] )
63 DROP ORDER_COLUMNS
64
65 其中关键字partition_action 为以下子句之一:
66
67
68 ALTER DEFAULT PARTITION
69 DROP DEFAULT PARTITION [IF EXISTS]
70 DROP PARTITION [IF EXISTS] { partition_name | FOR (value) } [CASCADE]
71 TRUNCATE DEFAULT PARTITION
72 TRUNCATE PARTITION { partition_name | FOR (value) }
73 RENAME DEFAULT PARTITION TO new_partition_name
74 RENAME PARTITION { partition_name | FOR (value) } TO new_partition_name
75 ADD DEFAULT PARTITION name [ ( subpartition_spec ) ]
76 ADD PARTITION [partition_name] partition_element
77 [ ( subpartition_spec ) ]
78 EXCHANGE PARTITION { partition_name | FOR (value) } WITH TABLE table_name
79 [ WITH | WITHOUT VALIDATION ]
80 EXCHANGE DEFAULT PARTITION WITH TABLE table_name
81 [ WITH | WITHOUT VALIDATION ]
82 SET SUBPARTITION TEMPLATE (subpartition_spec)
83 SPLIT DEFAULT PARTITION
84 { AT (list_value)
85 | START([datatype] range_value) [INCLUSIVE | EXCLUSIVE]
86 END([datatype] range_value) [INCLUSIVE | EXCLUSIVE] }
87 [ INTO ( PARTITION new_partition_name,
88 PARTITION default_partition_name ) ]
89 SPLIT PARTITION { partition_name | FOR (value) } AT (value)
90 [ INTO (PARTITION partition_name, PARTITION partition_name)]
91
92 其中关键字partition_element 为:
93
94
95 VALUES (list_value [,...] )
96 | START ([datatype] 'start_value') [INCLUSIVE | EXCLUSIVE]
97 [ END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE] ]
98 | END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE]
99 [ WITH ( partition_storage_parameter=value [, ... ] ) ]
100 [ TABLESPACE tablespace ]
101
102
103 其中关键字subpartition_spec为:
104
105 subpartition_element [, ...]
106
107
108 其中关键字subpartition_element为:
109
110 DEFAULT SUBPARTITION subpartition_name
111 | [SUBPARTITION subpartition_name] VALUES (list_value [,...] )
112 | [SUBPARTITION subpartition_name]
113 START ([datatype] 'start_value') [INCLUSIVE | EXCLUSIVE]
114 [ END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE] ]
115 [ EVERY ( [number | datatype] 'interval_value') ]
116 | [SUBPARTITION subpartition_name]
117 END ([datatype] 'end_value') [INCLUSIVE | EXCLUSIVE]
118 [ EVERY ( [number | datatype] 'interval_value') ]
119 [ WITH ( partition_storage_parameter=value [, ... ] ) ]
120 [ TABLESPACE tablespace ]
121
122 其中关键字storage_parameter为:
123
124 appendonly={TRUE|FALSE}
125 blocksize={8192-2097152}
126 orientation={COLUMN|ROW}
127 compresstype={ZLIB|ZSTD|QUICKLZ|RLE_TYPE|NONE}
128 compresslevel={0-9}
129 fillfactor={10-100}
130 oids[=TRUE|FALSE]
131 ```
132
133
134
135## 描述
136
137`ALTER TABLE` 更改一个表的定义。下文描述了几种形式:
138
139 `ADD COLUMN`
140 : 向表中增加一个新列,使用和`CREATE TABLE`相同的语义。`ENCODING` 子句只有在追加和列存储表中有效。
141
142 `DROP COLUMN [IF EXISTS]`
143 : 从表中删除列。
144
145 注意,如果删除用作PalopgMPP数据库分配键的表列,则表的分配策略将更改为`DISTRIBUTED RANDOMLY`。 涉及该列的索引和表约束也会自动删除。 如果表外的任何内容都取决于列(例如视图),则需要指定`CASCADE`。
146
147 如果指定了`IF EXISTS`且该列不存在,则不会引发任何错误; 而是发出通知。
148
149 `IF EXISTS`
150 : 如果表不存在,请不要抛出错误。 在这种情况下发出通知。
151
152 `SET DATA TYPE`
153 : 此表单更改表的列的数据类型。
154
155 请注意,您不能更改用作分发键或分区键的列数据类型。
156
157 通过重新解析最初提供的表达式,涉及该列的索引和简单表约束将自动转换为使用新的列类型。
158
159 可选的`COLLATE`子句为新列指定排序规则,如果省略,则排序规则是新列类型的默认排序规则。
160
161 可选的`USING`子句指定如何从旧的值计算新的列值。
162
163 如果省略,则默认转换与从旧数据类型到新数据类型的转换相同。
164
165 如果没有从旧类型转换为新类型的隐式或赋值,则必须提供`USING`子句。
166
167
168 `SET/DROP DEFAULT`
169 : 设置或删除列的默认值。
170
171 默认值仅适用于后续的`INSERT`或`UPDATE`命令。 它们不会导致表中已有的行发生更改。
172
173 `SET/DROP NOT NULL`
174 : 更改是将列标记为允许空值还是拒绝空值。
175
176 当列不包含空值时,只能使用`SET NOT NULL`。
177
178 `SET STATISTICS`
179 : 为后续的`ANALYZE`操作设置每个列的统计信息收集目标。
180 可以在100到10000的范围内设置目标,也可以设置为-1以使用系统默认统计信息目标(`default_statistics_target`)恢复为目标。
181
182 `SET ( attribute_option = value [, ... ])` \| `RESET ( attribute_option [, ...] )`
183 : 设置或重置每个属性选项。当前,唯一定义的按属性的选项是`n_distinct` 和`n_distinct_inherited`,它们覆盖了后续 `ANALYZE` 操作所做的不同值估计数。
184
185 `n_distinct`影响表本身的统计信息,而`n_distinct_inherited`影响表及其继承子级收集的统计信息。当设置为正值时,`ANALYZE`将假定该列恰好包含指定数量的不同非空值。当设置为负值(必须大于或等于-1)时,`ANALYZE`将假定列中不同的非空值的数量在表的大小中是线性的;确切的计数应通过将估计的表大小乘以给定数字的绝对值来计算。例如,值-1表示该列中的所有值都是不同的,而值-0.5表示每个值平均出现两次。当表的大小随时间变化时,这很有用,因为直到查询计划时间才执行表中行数的乘法。将值指定为0可恢复为通常估计不同值的数量
186
187 `ADD table_constraint [NOT VALID]`
188 : 使用与`CREATE TABLE`相同的语法向表(不仅仅是分区)添加新约束。 当前仅将`NOT VALID`选项用于外键和`CHECK`约束。 如果约束标记为`NOT VALID`,则PalopgMPP数据库将跳过可能冗长的初始检查,以验证表中的所有行均满足约束。
189
190 约束将仍然针对后续的插入或更新(即,对于外键而言,除非在引用表中有匹配的行,否则它们将失败;对于外键,除非新行与指定的检查匹配,否则它们将失败)。但是,除非使用`VALIDATE CONSTRAINT`选项对其进行验证,否则数据库将不假定该约束对表中的所有行均有效。
191
192
193 `VALIDATE CONSTRAINT`
194 : 该形式通过扫描表以确保没有不满足该约束的行,从而验证了以前创建为`NOT VALID`的外键约束。 如果约束已被标记为有效,则什么也不会发生。
195 将验证与约束的初始创建分开的好处是,与约束创建相比,验证对表的锁定更少。
196
197 `DISABLE/ENABLE CONSTRAINT`
198 : 禁用或启用属于该表的约束,目前支持外键约束(仅单机支持)、check约束、唯一约束和主键约束。
199 禁用的约束对于系统仍然是已知的,但是在其约束事件发生时不会执行。
200
201 `ADD table_constraint_using_index`
202 : 根据现有的唯一索引将新的 `PRIMARY KEY`或 `UNIQUE` 约束添加到表中。 索引的所有列都将包含在约束中。 索引不能具有表达式列,也不能是部分索引。
203 另外,它必须是具有默认排序顺序的b树索引。 这些限制确保索引等于由常规`ADD PRIMARY KEY`或`ADD UNIQUE`命令建立的索引。
204
205 如果指定了 `PRIMARY KEY`,并且索引的列尚未标记为`NOT NULL`,则此命令将尝试对每个此类列执行`ALTER COLUMN SET NOT NULL`。 这需要全表扫描,以验证列不包含空值。 在所有其他情况下,这是一个快速的操作。
206
207 如果提供了约束名称,那么索引将被重命名以匹配约束名称。 否则,约束将被命名为与索引相同。
208
209 执行此命令后,索引将由约束“拥有”,就像使用常规 `ADD PRIMARY KEY`或`ADD UNIQUE`命令构建索引一样。
210 特别是,删除约束将使索引也消失。
211
212
213 `DROP CONSTRAINT [IF EXISTS]`
214 : 将指定的约束放在表上。 如果指定了`IF EXISTS`且该约束不存在,则不会引发任何错误。
215 在这种情况下,将发出通知。
216
217 `DISABLE/ENABLE TRIGGER`
218 : 禁用或启用属于该表的触发器。
219 禁用的触发器对于系统仍然是已知的,但是在其触发事件发生时不会执行。
220 对于延迟的触发器,将在事件发生时而不是在实际执行触发器功能时检查启用状态。
221 可以禁用或启用由名称指定的单个触发器,或表上的所有触发器,或仅由用户创建的触发器。
222 禁用或启用约束触发器需要数据库管理员权限。
223
224 `CLUSTER ON/SET WITHOUT CLUSTER`
225 : 选择或删除默认索引以用于将来的`CLUSTER`操作。 它实际上并没有重新群集表。
226
227 注意,建议不要使用`CLUSTER`对PalopgMPP数据库中的表进行物理重新排序,因为它会花费很长时间。
228 最好使用`CREATE TABLE AS`重新创建表并按索引列对其进行排序。
229
230
231
232 `SET WITHOUT OIDS`
233 : 从表中删除OID系统列。
234
235 `SET ( FILLFACTOR = value)` \| `RESET (FILLFACTOR)`
236 : 更改表的填充因子。 表格的填充系数是10到100之间的百分比。默认值为100(完全打包)。
237 当指定较小的填充因子时,`INSERT`操作仅将表页面打包到指定的百分比;每个页面上的剩余空间都保留用于更新该页面上的行。这样,`UPDATE`就有机会将行的更新副本与原始副本放置在同一页面上,这比将其放置在另一页面上更为有效。
238
239 对于一个条目从不更新的表,完全打包是最佳选择,但在更新频繁的表中,较小的填充因子是合适的。
240 注意,此命令不会立即修改表内容。 您将需要重写表以获得所需的效果。
241
242 `SET DISTRIBUTED`
243 : 更改哈希分发策略,或更改为复制策略或从复制策略更改将导致表数据在磁盘上进行物理重新分发,这可能会占用大量资源。
244
245 `INHERIT parent_table | NO INHERIT parent_table`
246 : 添加或删除目标表作为指定父表的子表。 对父级的查询将包括其子表的记录。
247
248 作为子项添加,目标表必须已经包含与父项相同的所有列(它也可以具有其他列)。
249 这些列必须具有匹配的数据类型,并且如果它们在父级中具有`NOT NULL`约束,那么它们在子级中也必须具有`NOT NULL`约束。 对于父级的所有CHECK约束,还必须有匹配的子表约束,但在父级中标记为不可继承的(即用`ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT`创建)的约束除外。 匹配的所有子表约束均不得标记为不可继承。
250
251 当前不考虑`UNIQUE`, `PRIMARY KEY`和 `FOREIGN KEY`约束,但是将来可能会改变。
252
253 `OF type_name`
254 : 这种形式将表链接到复合类型,就像`CREATE TABLE OF`已经形成了它一样。
255 该表的列名和类型列表必须与组合类型的列表完全匹配; `oid`系统列的存在可以不同。
256 该表不得从任何其他表继承。 这些限制确保 `CREATE TABLE OF`将允许等效的表定义。
257
258 `NOT OF`
259 : 这种形式将类型化表与其类型分离。
260
261 `OWNER`
262 : 将表,序列或视图的所有者更改为指定的用户。
263
264 `SET TABLESPACE`
265 : 将表的表空间更改为指定的表空间,并将与表关联的数据文件移动到新表空间。表中的索引(如果有)不会移动;但是可以使用其他`SET TABLESPACE`命令分别移动它们。可以使用`ALL IN TABLESPACE`表单移动表空间中当前数据库中的所有表,该表单将锁定所有要先移动的表,然后再移动每个表。此表单还支持`OWNED BY`,该操作仅移动指定角色所拥有的表。如果指定了`NOWAIT`选项,则如果该命令无法立即获取所有必需的锁,则该命令将失败。请注意,此命令不会移动系统目录,请根据需要使用`ALTER DATABASE`或显式`ALTER TABLE`调用。
266
267 `information_schema`关系不视为系统目录的一部分,将被移动。另请参见`CREATE TABLESPACE`。如果更改分区表的表空间,则所有子表分区也将移至新表空间。
268
269 `ADD ORDER_COLUMNS( column_name [, ... ] )`
270 : 这种形式设置一个表的排序列,最多可设置8个排序列。目前只支持列存表进行指定,分区表主表新增可为所有列存子表新增。
271
272 `DROP ORDER_COLUMNS`
273 : 这种形式将删除一个表的所有排序列。目前只支持列存表进行指定,分区表主表删除可为所有列存子表删除。
274
275 `RENAME`
276 : 更改表(或索引,序列或视图)的名称,表中单个列的名称或表的约束的名称。
277 对存储的数据没有影响。 请注意,PalopgMPP数据库分发密钥列不能重命名。
278
279 `SET SCHEMA` — 将表移到另一个架构。
280 : 表列拥有的关联索引,约束和序列也将移动。
281
282 `ALTER PARTITION` \| `DROP PARTITION` \| `RENAME PARTITION` \| `TRUNCATE PARTITION` \| `ADD PARTITION` \| `SPLIT PARTITION` \| `EXCHANGE PARTITION` \| `SET SUBPARTITION TEMPLATE`
283 : 更改分区表的结构。 在大多数情况下,您必须遍历父表才能更改其子表分区之一。
284
285
286 注意: 如果将分区添加到具有子分区编码的表中,则新分区将继承该子分区的存储指令。
287 有关压缩设置优先级的更多信息,请参阅PalopgMPP Database Administrator Guide中的“使用压缩”。
288
289
290 除 `RENAME`和`SET SCHEMA`之外,所有作用于单个表的ALTER TABLE形式都可以组合成多个更改列表以一起应用。
291 例如,可以在单个命令中添加几列和/或更改几列的类型。 这对于大型表尤其有用,因为只需要对表进行一次遍历。
292
293 必须拥有该表才能使用`ALTER TABLE`。 要更改表的架构或表空间,您还必须对新架构或表空间具有`CREATE`权限。
294
295 要将表添加为父表的新子级,还必须拥有父表。
296
297 要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对表的架构具有`CREATE`权限。要添加列或更改列类型或使用`OF`子句,您还必须对数据类型具有`USAGE`权限。 数据库管理员自动具有这些权限。
298
299
300 注意:如果表具有多个分区,表具有压缩功能或表的块大小很大,则内存使用量会显着增加。
301
302 如果与该表关联的关系的数量很大,则这种情况可能会迫使对该表进行的操作使用更多的内存。例如,如果该表是一个CO表并具有大量列,则每个列都是一个关系。诸如`ALTER TABLE ALTER COLUMN`之类的操作将打开表中的所有列,以分配关联的缓冲区。如果CO表具有40列和100个分区,并且这些列被压缩并且块大小为2MB(系统系数为3),则系统尝试分配24 GB,即(40×100)×(2× 3)MB或24GB。
303
304
305## 参数
306
307该SQL命令参数说明见下
308
309 `ONLY`
310 : 仅对指定的表名执行操作。 如果不使用 `ONLY`关键字,则将在命名表以及与该表关联的任何子表分区上执行该操作。
311
312 `name`
313 : 要更改的现有表的名称(可能是模式限定的)。 如果`ONLY`指定,则仅更改该表。
314 如果未指定`ONLY`,则更新表及其所有后代表(如果有)。
315
316 `column_name`
317 : 新列或现有列的名称。 请注意,PalopgMPP数据库分发键列必须格外小心。 更改或删除这些列可以更改表的分发策略。
318
319 `new_column_name`
320 : 现有列的新名称。
321
322 `new_name`
323 : 表的新名称。
324
325 `type`
326 : 新列的数据类型,或现有列的新数据类型。
327 如果更改PalopgMPP分布键列的数据类型,则只能将其更改为兼容类型(例如,`text`到`varchar`可以,但`text`到`int`则不能)。
328
329 `table_constraint`
330 : 表的新表约束。 请注意,PalopgMPP数据库当前不支持外键约束。
331 此外,表仅允许一个唯一约束,并且唯一性必须在PalopgMPP数据库分发密钥内。
332
333 `constraint_name`
334 : 要删除的现有约束的名称。
335
336 `CASCADE`
337 : 自动删除依赖于已删除列或约束的对象(例如,引用该列的视图)。
338
339 `RESTRICT`
340 : 如果有任何相关对象,则拒绝删除列或约束。 这是默认行为。
341
342 `trigger_name`
343 : 要禁用或启用的单个触发器的名称。 请注意,PalopgMPP数据库不支持触发器。
344
345 `ALL`
346 : 禁用或启用属于该表的所有触发器,包括与约束相关的触发器。
347 如果任何触发器是内部生成的约束触发器(例如用于实现外键约束或可延迟的唯一性和排除约束的触发器),则这需要数据库管理员权限。
348
349 `USER`
350 : 禁用或启用属于该表的所有触发器,但内部生成的约束触发器(例如用于实现外键约束或可延迟的唯一性和排除约束的触发器除外)除外。
351
352 `index_name`
353 : 表应标记为集群的索引名称。
354
355 注意,建议不要使用`CLUSTER`对PalopgMPP数据库中的表进行物理重新排序,因为它会花费很长时间。
356 最好使用`CREATE TABLE AS`重新创建表并按索引列对其进行排序。
357
358 `FILLFACTOR`
359 : 设置表格的填充系数百分比。
360
361 `value`
362 : `FILLFACTOR`参数的新值,介于10到100之间的百分比。默认值为100。
363
364 `DISTRIBUTED BY ({column_name [opclass]}) `\| `DISTRIBUTED RANDOMLY` \| `DISTRIBUTED REPLICATED`
365 : 指定表的分发策略。 更改哈希分发策略会导致物理上重新分配表数据,这可能会占用大量资源。
366 如果声明相同的哈希分配策略或从哈希更改为随机分配,则除非声明`SET WITH (REORGANIZE=true)`,否则不会重新分配数据。
367 更改为复制的分发策略或从复制的分发策略更改将导致表数据被重新分发。
368
369 `REORGANIZE=true|false`
370 : 当哈希分配策略未更改或从哈希更改为随机分配,并且无论如何都希望重新分配数据时,请使用`REORGANIZE=true` 。
371
372 `parent_table`
373 : 父表要与此表关联或取消关联。
374
375 `new_owner`
376 : 表的新所有者的角色名称。
377
378 `new_tablespace`
379 : 该表将被移动到的表空间的名称。
380
381 `new_schema`
382 : 表将被移动到的模式的名称。
383
384 `parent_table_name`
385 : 更改分区表时,顶级父表的名称。
386
387 `ALTER [DEFAULT] PARTITION`
388 : 如果要更改的分区比第一级分区深,请使用`ALTER PARTITION`子句指定要更改层次结构中的哪个子分区
389
390 `DROP [DEFAULT] PARTITION`
391 : 删除指定的分区。 如果分区具有子分区,则子分区也会自动删除。
392
393 `TRUNCATE [DEFAULT] PARTITION`
394 : 截断指定的分区。 如果分区具有子分区,则子分区也会自动被截断。
395
396 `RENAME [DEFAULT] PARTITION`
397 : 更改分区的分区名称(而不是关系名称)。 分区表是使用以下命名约定创建的:
398 `<``parentname``>_<``level``>_prt_<``partition_name``>`.
399
400 `ADD DEFAULT PARTITION`
401 : 将默认分区添加到现有分区设计中。 当数据与现有分区不匹配时,会将其插入默认分区。 没有默认分区的分区设计将拒绝与现有分区不匹配的传入行。
402 必须为默认分区指定名称。
403
404 `ADD PARTITION`
405 : `partition_element`
406 : 使用表(范围或列表)的现有分区类型,定义要添加的新分区的边界。
407
408 `name`
409 : 此新分区的名称。
410
411 `VALUES`
412 : 对于列表分区,定义分区将包含的值。
413
414 `START`
415 : 对于范围分区,定义分区的起始范围值。 默认情况下,起始值为`INCLUSIVE`。 例如,如果您声明开始日期为“`2016-01-01`”,则分区将包含所有大于或等于“ `2016-01-01`”的日期。
416 通常,`START`表达式的数据类型与分区键列的类型相同。如果不是这种情况,则必须显式转换为预期的数据类型。
417
418 `END`
419 : 对于范围分区,定义分区的结束范围值。 默认情况下,最终值为`EXCLUSIVE`。 例如,如果您声明结束日期为“'`2016-02-01`”,则分区将包含所有小于但不等于“ '`2016-02-01`”的日期。 通常,
420 `END`表达式的数据类型与分区键列的类型相同。如果不是这种情况,则必须显式转换为预期的数据类型。
421
422 `WITH`
423 : 设置分区的表存储选项。
424
425 `TABLESPACE`
426 : 要在其中创建分区的表空间的名称。
427
428 `subpartition_spec`
429 : 仅允许在没有子分区模板的情况下创建的分区设计。 声明要添加的新分区的子分区规范。
430 如果分区表最初是使用子分区模板定义的,则该模板将用于自动生成子分区。
431
432 `EXCHANGE [DEFAULT] PARTITION`
433 : 将另一个表交换到分区层次结构中,替换为现有分区的位置。 在多级分区设计中,您只能交换最低级别的分区(包含数据的分区)。
434
435 配置参数`sc_enable_exchange_default_partition`控制`EXCHANGE DEFAULT PARTITION`子句的可用性。 该参数的默认值是`off`。 该子句不可用,如果在`ALTER
436 TABLE`命令中指定了该子句,数据库将返回错误。
437
438 `WITH TABLE table_name`
439 : 要交换到分区设计中的表的名称。可以交换一个表,其中表数据存储在数据库中。
440
441 例如,该表是使用`CREATE TABLE`命令创建的。 该表必须具有与父表相同的列数,列顺序,列名,列类型和分发策略。
442
443 使用`EXCHANGE PARTITION`子句,您还可以将可读的外部表(使用`CREATE EXTERNAL TABLE`命令创建)交换到分区层次结构中,而不是现有的叶子子分区。
444 如果指定了可读的外部表,则还必须指定`WITHOUT VALIDATION`子句,以针对要交换的分区的 `CHECK`约束跳过表验证。
445 如果分区表包含具有检查约束或`NOT NULL`约束的列,则不支持与外部表交换叶子分区。无法与复制表交换分区。 不支持将分区与分区表或分区表的子分区交换。
446
447 `WITH` \| `WITHOUT VALIDATION`
448 : 验证表中的数据是否与您要交换的分区的`CHECK`约束相匹配。默认设置是根据`CHECK`约束验证数据。
449
450 注意: 如果指定`WITHOUT VALIDATION`子句,则必须确保针对现有子叶分区交换的表中的数据对于分区上的`CHECK`约束是有效的。
451
452 `SET SUBPARTITION TEMPLATE`
453 : 修改现有分区的子分区模板。 设置新的子分区模板后,所有添加的新分区将具有新的子分区设计(现有分区不会被修改)。
454
455 `SPLIT DEFAULT PARTITION`
456 : 分割默认分区。 在多级分区中,只能拆分范围分区,而不能拆分列表分区,并且只能拆分最低级别的默认分区(包含数据的分区)。拆分默认分区将创建一个包含指定值的新分区,并保留默认分区,其中包含与现有分区不匹配的任何值。
457
458 AT
459 : 对于列表分区表,指定一个列表值,该值应用作拆分条件。
460
461 START
462 : 对于范围分区表,指定新分区的起始值。
463
464 END
465 : 对于范围分区表,指定新分区的结束值。
466
467 INTO
468 : 允许为新分区指定名称。 使用`INTO`子句拆分默认分区时,指定的第二个分区名称应始终为现有默认分区的名称。如果不知道默认分区的名称,则可以使用`pg_partitions`视图进行查找。
469
470 `SPLIT PARTITION `
471 : 将现有分区分为两个分区。 在多级别分区中,只能拆分范围分区,而不能拆分列表分区,并且只能拆分最低级别的分区(包含数据的分区)。
472
473 AT
474 : 指定一个单一值,该值应用作分割条件。 该分区将分为两个新分区,指定的分割值是后一个分区的起始范围。
475
476 INTO
477 : 允许用户为分裂创建两个新分区指定名字。
478
479 `partition_name`
480 : 给定的分区名称。
481
482 `FOR ('value') `
483 : 通过声明一个落在分区边界说明中的值来指定一个分区。如果用`FOR`声明的值匹配一个分区和它的一个子分区(例如,如果值是一个日期并且表先按月分区然后按日分区),那么`FOR`将在第一个找到匹配的层次上操作(例如,每月的分区)。如果用户的目的是在子分区上操作,则必须按如下的方式声明:`ALTER TABLE name ALTER PARTITION FOR ('2016-10-01') DROP PARTITION FOR ('2016-10-01');`
484
485
486
487
488
489注解
490: `ALTER TABLE` 命令中指定的表名不能是一个表中的分区名。
491
492 在修改或者删除作为PalopgMPP数据库分布键一部分的列时要特别小心,因为这可能会改变表的分布策略。.
493
494 PalopgMPP数据库当前不支持外键约束。对于要在PalopgMPP数据库中实施的唯一约束,表必须被哈希分布(不能用`DISTRIBUTED RANDOMLY`),并且所有的分布键列必须和唯一约束列中前部的列相同。
495
496 增加`CHECK`或者`NOT NULL`约束要求扫描表以验证现有的行是否符合约束。
497
498 当使用`ADD COLUMN`添加列时,表中的所有现有行都使用该列的默认值初始化,如果未指定`DEFAULT`子句,则初始化为`NULL`。添加具有非空默认值的列或更改现有列的类型将需要重写整个表和索引。作为例外,如果`USING`子句不更改列的内容,并且旧类型可以强制转换为新类型或新类型不受限制的域,则不需要重写表,但是受影响列上的任何索引都必须仍在重建中。添加或删除系统`oid`列还需要重写整个表。对于大型表,表和/或索引的重建可能会花费大量时间;并且暂时需要多达两倍的磁盘空间。
499
500 可以在单个`ALTER TABLE`命令中指定多个更改,这些更改将在表上一次传递。
501
502 `DROP COLUMN`表单不会物理删除列,而只是使它对SQL操作不可见。表中随后的插入和更新操作将为该列存储一个空值。因此,删除列很快,但是不会立即减小表的磁盘大小,因为删除的列所占用的空间不会被回收。随着现有行的更新,空间将随着时间的推移而回收。但是,如果删除系统`oid`列,则表将立即被重写。
503
504 要强制立即回收被删除的列占用的空间,您可以执行`ALTER TABLE`的一种形式来重写整个表。这将导致重建的每一行,并将删除的列替换为空值。
505
506 `ALTER TABLE`的重写形式不是MVCC安全的。在表重写之后,如果并发事务使用的是在重写发生之前拍摄的快照,则该表将对并发事务显示为空。
507
508 `SET DATA TYPE`的`USING`选项实际上可以指定涉及该行的旧值的任何表达式。也就是说,它可以引用其他列以及要转换的列。这允许使用`SET DATA TYPE`语法完成非常通用的转换。由于具有这种灵活性,因此`USING`表达式不会应用于列的默认值(如果有);结果可能不是默认值所需的常量表达式。这意味着当没有从旧类型到新类型的隐式或赋值转换时,即使提供了`USING`子句,`SET DATA TYPE`也可能无法转换默认值。在这种情况下,请使用`DROP DEFAULT`删除默认值,执行`ALTER TYPE`,然后使用`SET DEFAULT`添加合适的新默认值。类似的考虑适用于涉及该列的索引和约束。
509
510 如果表已分区或具有任何后代表,则不允许在父表中添加,重命名或更改列的类型或重命名继承的约束,而无需对后代进行相同的操作。这样可以确保后代始终具有与父代匹配的列。
511
512 要查看分区表的结构,可以使用视图`pg_partitions`。该视图可以帮助您识别您可能要更改的特定分区。
513
514 仅当后代不从任何其他父级继承该列并且从未对该列进行独立定义时,递归`DROP COLUMN`操作才会删除后代表的列。非递归`DROP COLUMN`(仅`ALTER TABLE ONLY ... DROP COLUMN`)从不删除任何后代列,而是将它们标记为独立定义而不是继承。
515
516 `TRIGGER`, `CLUSTER`, `OWNER`和`TABLESPACE`操作永远不会递归到后代表。也就是说,它们始终像指定`ONLY`那样起作用。仅对未标记为`NO INHERIT`的`CHECK`约束重复添加约束。
517
518
519 如果包含已被交换以使用外部表的叶子分区的分区表上的数据没有更改,则支持这些`ALTER PARTITION`操作。否则,将返回错误。
520
521
522 - Adding or dropping a column.
523
524 - Changing the data type of column.
525
526
527
528 分区表不支持这些`ALTER PARTITION`操作,该分区表包含已被交换以使用外部表的叶子分区:
529
530
531 - Setting a subpartition template.
532
533 - Altering the partition properties.
534
535 - Creating a default partition.
536
537 - Setting a distribution policy.
538
539 - Setting or dropping a `NOT NULL` constraint of column.
540
541 - Adding or dropping constraints.
542
543 - Splitting an external partition.
544
545
546 不允许更改系统目录表的任何部分。
547
548
549
550## 示例
551
552向列中添加列:
553
554 ``` sql
555 ALTER TABLE distributors ADD COLUMN address varchar(30);
556 ```
557
558 重命名现有列:
559
560 ``` sql
561 ALTER TABLE distributors RENAME COLUMN address TO city;
562 ```
563
564 重命名现有表:
565
566 ``` sql
567 ALTER TABLE distributors RENAME TO suppliers;
568 ```
569
570 向列添加非空约束:
571
572 ``` sql
573 ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
574 ```
575
576 重命名现有约束:
577
578 ``` sql
579 ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;
580 ```
581
582 向表及其所有子级添加检查约束:
583
584 ``` sql
585 ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK
586 (char_length(zipcode) = 5);
587 ```
588
589 要将检查约束仅添加到表而不是其子表,请执行以下操作:
590
591 ``` sql
592 ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;
593 ```
594
595 (检查约束也不会被将来的子代继承。)
596
597 从表及其所有子级中删除检查约束:
598
599 ``` sql
600 ALTER TABLE distributors DROP CONSTRAINT zipchk;
601 ```
602
603 仅从一个表中删除检查约束:
604
605 ``` sql
606 ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
607 ```
608
609 (对于任何继承`distributors`的子表,检查约束仍然存在。)
610
611 将表移动到不同的模式:
612
613 ``` sql
614 ALTER TABLE myschema.distributors SET SCHEMA yourschema;
615 ```
616
617 将表的分发策略更改为已复制:
618
619 ``` sql
620 ALTER TABLE myschema.distributors SET DISTRIBUTED REPLICATED;
621 ```
622
623 将新分区添加到分区表:
624
625 ``` sql
626 ALTER TABLE sales ADD PARTITION
627 START (date '2017-02-01') INCLUSIVE
628 END (date '2017-03-01') EXCLUSIVE;
629 ```
630
631 向现有分区设计添加默认分区:
632
633 ``` sql
634 ALTER TABLE sales ADD DEFAULT PARTITION other;
635 ```
636
637 重命名分区:
638
639 ``` sql
640 ALTER TABLE sales RENAME PARTITION FOR ('2016-01-01') TO
641 jan08;
642 ```
643
644 将表交换到用户的分区设计中:
645
646 ``` sql
647 ALTER TABLE sales EXCHANGE PARTITION FOR ('2016-01-01') WITH
648 TABLE jan08;
649 ```
650
651 拆分默认分区(现有的默认分区名称`other`)为2017年1月添加新的每月分区:
652
653 ``` sql
654 ALTER TABLE sales SPLIT DEFAULT PARTITION
655 START ('2017-01-01') INCLUSIVE
656 END ('2017-02-01') EXCLUSIVE
657 INTO (PARTITION jan09, PARTITION other);
658 ```
659
660 将每月分区分成两个分区,第一个分区包含日期1月1日至15日,第二个分区包含日期1月16日至31日:
661
662 ``` sql
663 ALTER TABLE sales SPLIT PARTITION FOR ('2016-01-01')
664 AT ('2016-01-16')
665 INTO (PARTITION jan081to15, PARTITION jan0816to31);
666 ```
667
668 要重新创建主键约束,而在重建索引时不阻止更新:
669
670 ``` sql
671 CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
672 ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
673 ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;
674
675 ```
676
677
678
679兼容性说明
680: `ADD` (不包含 `USING INDEX`), `DROP`, `SET DEFAULT`和 `SET DATA TYPE` (不包含`USING`) 符合SQL标准。 其他形式是SQL标准的PalopgMPP数据库扩展。 同样,在单个`ALTER TABLE`命令中指定多个操纵的功能也是一种扩展。
681
682 `ALTER TABLE DROP COLUMN`可用于删除表的唯一列,而保留零列表。 这是SQL的扩展,不允许使用零列表。
683
684
685
686相关SQL命令
687: `CREATE TABLE`, `DROP TABLE`
评价此篇文章
