如何在postgresql中创建*交换表(带/索引)

时间:2014-05-20 10:37:28

标签: sql database postgresql

我在postgres中有一个students表,通过外部源填充。每天晚上我们填充students_swap表,然后在长时间运行操作完成后,我们将其重命名为students,然后原始表格变为students_swap以便在第二天使用。

这个问题是当我们向原始表添加新列或索引时,我们必须记住在交换表上也这样做。我试图使用以下内容自动执行其中一些操作:

-- Drop the swap table if it's already there...
DROP TABLE IF EXISTS students_swap;

-- Recreate the swap table using the original as a template...
CREATE TABLE students_swap AS SELECT * FROM students WHERE 1=2;

... populate the swap table ....

ALTER TABLE students RENAME TO students_temp;
ALTER TABLE students_swap RENAME TO ps_students;
ALTER TABLE students_temp RENAME TO students_swap;

这适用于创建表结构但不为交换表创建索引。

我的问题是除了表结构之外我如何复制所有索引以确保原始表和交换表保持同步?

1 个答案:

答案 0 :(得分:7)

改为使用create table ... like

CREATE TABLE students_swap (LIKE students INCLUDING ALL);

这将包括索引,主键和检查约束,但重新创建外键。

修改

INCLUDING ALL还会复制由序列填充的列的默认设置(例如,定义为serial的列)。听起来好像你想要那样。如果您不想这样,请改用INCLUDING INDEXES INCLUDING CONSTRAINTS