2016-06-24 11 views
0

Ich bin neu bei Postgres (am 9.5) und ich kann das nirgends in der Dokumentation finden.Tabelle kopieren (Tabelle erstellen) - nicht automatisch inkrementieren Primärschlüssel

Im Grunde eine Tabelle wie folgt erstellen:

CREATE TABLE test (
     id serial primary key, 
     field1 CHARACTER VARYING(50) 
     ); 

Dann kopieren:

create table test_copy (like test); 

Die Tabelle Test diese Spalten:

COLUMN_NAME id field1 
DATA_TYPE 4 12 
TYPE_NAME serial varchar 
COLUMN_SIZE 10 50 
IS_NULLABLE NO YES 
IS_AUTOINCREMENT  YES NO 

Aber test_copy hat diese:

COLUMN_NAME id field1 
DATA_TYPE 4 12 
TYPE_NAME int4 varchar 
COLUMN_SIZE 10 50 
IS_NULLABLE NO YES 
IS_AUTOINCREMENT  NO NO 

Warum verliere ich serielle und Autoincrement? Wie kann ich eine Kopie einer Tabelle erstellen, die diese enthält?

Antwort

1

können Sie versuchen:

create table test_inh() inherits (test); und dann

alter table test_inh no inherit test;

sollte für Sie gleiche Sequenz Standardwert verlassen

+0

Es scheint, wie das funktioniert. Für was ist die Alter-Anweisung? – Greg

+1

Wenn Sie die Tabelle erben, kopiert sie nicht nur die Struktur, sie "behält die Referenz". https://www.postgresql.org/docs/current/static/ddl-inherit.html also, wenn Sie nur Struktur replizieren wollen, erstellen Sie erben Tabelle und gthen enterit es –

1

Dies liegt daran, serial nicht wirklich ein Datentyp ist. Es wird zu einer Ganzzahl + einer Sequenz + einem Standardwert "erweitert".

See the manual for details

Um die Standard-Definition, die Sie benötigen zu erhalten create table test_copy (like test INCLUDING DEFAULTS) zu verwenden.

Das wird dann aber die gleiche Sequenz als die ursprüngliche Tabelle verwenden.

Sie können den Unterschied sehen, wenn Sie die Tabellendefinition Anzeige in 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

Danke! Um zu verdeutlichen, was meinst du mit der "gleichen Sequenz"? Ist das etwas, was ich nicht will? – Greg

Verwandte Themen