Postgres使用CREATE TABLE LIKE如何排除约束同时保留索引
方案说明
PostgreSQL 的 CREATE TABLE ... LIKE 语法支持叠加多个 INCLUDING/EXCLUDING 参数,不需要二选一,按你的需求可以直接参考对应场景实现:
场景1:排除所有约束(主键、唯一、外键、非空),保留独立普通索引
直接组合两个参数即可:
CREATE TABLE users_audit ( LIKE users EXCLUDING CONSTRAINTS INCLUDING INDEXES );
注意:该方案下由主键、唯一约束自动生成的关联索引会随约束一起被排除,仅手动创建的独立普通索引会被保留。
场景2:仅排除主键约束,保留其余所有结构(含唯一约束、普通索引、非空约束等)
如果使用 PostgreSQL 11 及以上版本,可以单独指定排除主键:
CREATE TABLE users_audit ( LIKE users EXCLUDING PRIMARY KEY INCLUDING ALL );
如果是更低版本不支持单独排除主键,可分两步实现:
-- 第一步:全量复制原表所有结构(含约束、索引) CREATE TABLE users_audit (LIKE users INCLUDING ALL); -- 第二步:手动删除主键约束 ALTER TABLE users_audit DROP CONSTRAINT IF EXISTS users_pkey;
如果需要同时复制原表的所有数据,在CREATE TABLE语句末尾添加WITH DATA即可。
内容的提问来源于stack exchange,提问作者user4676307
相关产品推荐
相关产品推荐

