2016-06-24 51 views
0

我是新來的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 

爲什麼我失去了序列和自動增量?我如何製作保存這些表的副本?

回答

1

你可以試試:

create table test_inh() inherits (test); 然後

alter table test_inh no inherit test;

應該離開相同的序列默認值您

+0

好像工程。改變聲明是什麼? – Greg

+1

當你繼承表時它不僅複製結構它「保持參考」。 https://www.postgresql.org/docs/current/static/ddl-inherit.html所以如果你只想複製結構,你創建了繼承表,然後gthen uninherit它 –

1

這是因爲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) | 
+0

謝謝!澄清一下,你對「同一序列」的含義是什麼?那是我不想要的嗎? – Greg