Skip to content

Partitioning an existing table with same name

我们关于表分区的文档在这里:https://supabase.com/docs/guides/database/partitions

🌐 Our documentation on table partitioning here: https://supabase.com/docs/guides/database/partitions

如果你想让分区表保留原表的名称,请阅读以下信息。

🌐 Read the below information if you want the partitioned table to retain the name of the original table.

  • 你可以使用 CREATE TABLE parent_table LIKE source_table [ like_option ... ] PARTITION BY ... 来创建空的“父”分区表

LIKE 选项会自动复制源表的列定义、约束等。有关不同的 like_options,请参见 https://www.postgresql.org/docs/current/sql-createtable.html(你可以试试 INCLUDING ALL 这个 like 选项)。

🌐 LIKE option will copy column definitions, constraints etc. from source table automatically. For different like_options see https://www.postgresql.org/docs/current/sql-createtable.html (you could try INCLUDING ALL like option).

  • 然后你可以为你喜欢的范围创建空分区。
  • 然后你可以把旧表/原始表中的行插入到 parent_table 中。它们会几乎无成本地分布到各个分区中。但这个过程可能会花一些时间。作为实验,你可以从原始表中插入一个子集(使用 ORDER BY id LIMIT <number> 子句)看看实际操作需要的时间。
  • 同时,检查默认分区(包含插入到父表但不对应任何分区范围的行),以确保你没有忘记某些范围是很重要的。默认分区过大几乎会减慢对分区表的任何操作。
  • 当插入完成后,你可以重命名旧的和新的“父”表。最好在一个事务中完成,这样就不会出现旧名称已经不存在但还没被任何查询重新创建的情况。
  • 索引定义将会使用“包括全部”选项复制。它们会在将数据插入新父表时进行传播。
  • 当然,你可以保留旧表以确保你的数据长期安全。不要直接删除它!重命名后你的查询不会使用它。索引等在后台工作,你不用关心它们的名字。(实际上,“新”分区表的索引会是新的,但如果你使用了 LIKE..INCLUDING ALL 选项,你是看不到的。)
  • 需要为“父”分区表使用 CREATE TRIGGER 子句重新创建触发器 https://www.postgresql.org/docs/16/sql-createtrigger.html
  • 重命名后,函数会切换到使用新表。
  • 声明式分区有一些你可能需要注意的限制:https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE