复制表(创建表格) - 不保持自动递增主键

时间:2016-06-24 13:24:19

标签: sql postgresql postgresql-9.5

我是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

为什么我会失去连续和自动增量?如何制作保留这些内容的表的副本?

2 个答案:

答案 0 :(得分:2)

这是因为serial不是真正的数据类型。它被“扩展”为整数+序列+默认值。

See the manual for details

要获取默认定义,您需要使用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;

应为您保留相同的序列默认值