我是postgres的新手(在9.5上),我无法在任何地方的文档中找到它。
基本上创建一个这样的表:
CREATE TABLE test (
id serial primary key,
field1 CHARACTER VARYING(50)
);
然后复制它:
create table test_copy (like test);
表格测试包含以下列:
COLUMN_NAME id field1
DATA_TYPE 4 12
TYPE_NAME serial varchar
COLUMN_SIZE 10 50
IS_NULLABLE NO YES
IS_AUTOINCREMENT YES NO
但是test_copy有这些:
COLUMN_NAME id field1
DATA_TYPE 4 12
TYPE_NAME int4 varchar
COLUMN_SIZE 10 50
IS_NULLABLE NO YES
IS_AUTOINCREMENT NO NO
为什么我会失去连续和自动增量?如何制作保留这些内容的表的副本?
答案 0 :(得分:2)
这是因为serial
不是真正的数据类型。它被“扩展”为整数+序列+默认值。
要获取默认定义,您需要使用create table test_copy (like test INCLUDING DEFAULTS)
。
然而,那将使用相同序列作为原始表。
在psql
中显示表格定义时,您可以看到差异:
psql (9.5.3)
Type "help" for help.
postgres=> CREATE TABLE test (
postgres(> id serial primary key,
postgres(> field1 CHARACTER VARYING(50)
postgres(> );
CREATE TABLE
postgres=> create table test_copy_no_defaults (like test);
CREATE TABLE
postgres=> create table test_copy (like test including defaults);
CREATE TABLE
postgres=> \d test
Table "public.test"
Column | Type | Modifiers
--------+-----------------------+---------------------------------------------------
id | integer | not null default nextval('test_id_seq'::regclass)
field1 | character varying(50) |
Indexes:
"test_pkey" PRIMARY KEY, btree (id)
postgres=> \d test_copy
Table "public.test_copy"
Column | Type | Modifiers
--------+-----------------------+---------------------------------------------------
id | integer | not null default nextval('test_id_seq'::regclass)
field1 | character varying(50) |
postgres=> \d test_copy_no_defaults
Table "public.test_copy_no_defaults"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer | not null
field1 | character varying(50) |
答案 1 :(得分:1)
你可以尝试:
create table test_inh () inherits (test);
然后
alter table test_inh no inherit test;
应为您保留相同的序列默认值