我在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;
这适用于创建表结构但不为交换表创建索引。
我的问题是除了表结构之外我如何复制所有索引以确保原始表和交换表保持同步?
答案 0 :(得分:7)
改为使用create table ... like
:
CREATE TABLE students_swap (LIKE students INCLUDING ALL);
这将包括索引,主键和检查约束,但不重新创建外键。
修改强>:
INCLUDING ALL
还会复制由序列填充的列的默认设置(例如,定义为serial
的列)。听起来好像你想要那样。如果您不想这样,请改用INCLUDING INDEXES INCLUDING CONSTRAINTS
。