Oracle如何基于现有表建表时同步设置原表主键?
问题解答
在Oracle中,直接修改CREATE TABLE people1 AS (SELECT * FROM people);这类CTAS(Create Table As Select)语句,没办法直接给新表的id字段设置主键——因为CTAS的设计逻辑是仅复制原表的列数据类型、长度,以及NOT NULL这类基础约束,不会自动同步主键、外键、唯一约束,也不支持在AS子句后直接追加约束定义。
不过你可以换一种写法,显式定义新表的列结构并指定主键,同时通过AS SELECT导入原表数据,实现“建表+设主键+导数据”一步完成:
CREATE TABLE people1 ( id int PRIMARY KEY, name varchar(55), status int, phone varchar(55) ) AS SELECT * FROM people;
注意事项:
- 显式定义的列顺序、数据类型必须和
SELECT * FROM people返回的列完全匹配,否则会抛出类型不匹配或列数不一致的错误。 - 如果原表
id列存在重复值(虽然原表id是主键不会出现,但其他场景要注意),执行这条语句会因主键唯一性约束报错,需先清理重复数据再操作。
内容的提问来源于stack exchange,提问作者noobprogrammer1987
相关产品推荐
相关产品推荐

