2011-02-15 13 views
6

Me pregunto si todos estos son exactamente iguales o si hay alguna diferencia.¿Alguna diferencia en la forma en que se define una clave principal en Postgres?

Método 1:

CREATE TABLE testtable 
(
    id serial, 
    title character varying, 
    CONSTRAINT id PRIMARY KEY (id) 
); 

Método: 2

CREATE TABLE testtable 
(
    id serial PRIMARY KEY, 
    title character varying, 
); 

Método 3:

CREATE TABLE testtable 
(
    id integer PRIMARY KEY, 
    title character varying, 
); 

CREATE SEQUENCE testtable_id_seq 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO MINVALUE 
    CACHE 1; 

ALTER SEQUENCE testtable_id_seq OWNED BY testtable.id; 

Actualización: he encontrado algo en la web diciendo que mediante el uso de una prima secuencia puede preasignar memoria para claves primarias que ayuda si p lan haciendo varios miles de insertos en el próximo minuto.

+0

Lo que me parece extraño es que no creó una tabla y luego creó la restricción primaria (por ejemplo 'CREATE TABLE (...);', 'ALTER TABLE ADD CONTSRAINT ...'), para fines de prueba. – vol7ron

Respuesta

5

Pruébalo y ver; eliminar el arrastre "" después de 'variable' en la segunda y tercera de manera que corran, ejecutar cada uno de ellos, y luego hacer:

\d testtable 

después de cada uno y se puede ver lo que sucede. Luego suelta la mesa y pasa a la siguiente. Se parece a esto:

Column |  Type  |      Modifiers       
--------+-------------------+-------------------------------------------------------- 
id  | integer   | not null default nextval('testtable_id_seq'::regclass) 
title | character varying | 
Indexes: 
    "id" PRIMARY KEY, btree (id) 

Column |  Type  |      Modifiers       
--------+-------------------+-------------------------------------------------------- 
id  | integer   | not null default nextval('testtable_id_seq'::regclass) 
title | character varying | 
Indexes: 
    "testtable_pkey" PRIMARY KEY, btree (id) 

Column |  Type  | Modifiers 
--------+-------------------+----------- 
id  | integer   | not null 
title | character varying | 
Indexes: 
    "testtable_pkey" PRIMARY KEY, btree (id) 

primero y segundo son casi idénticos, excepto la clave principal creado se denomina de forma diferente. En el tercero, la secuencia ya no se completa cuando se inserta en la base de datos. Primero debe crear la secuencia y luego crear la tabla de la siguiente manera:

CREATE TABLE testtable 
(
    id integer PRIMARY KEY DEFAULT nextval('testtable_id_seq'), 
    title character varying 
); 

Para obtener algo que se ve igual que el segundo. Lo único positivo es que puede usar la directiva CACHE para preasignar algunos números de secuencia. Es posible que sea un drenaje de recursos lo suficientemente grande como para reducir la contención. Pero tendrías que hacer varios miles de inserts por segundo, no por minuto, antes de que eso ocurra.

3

No hay diferencia semántica entre los métodos 1 y 2.

Método 3 es bastante similar, también - es lo que sucede de forma implícita, cuando se utiliza en serie. Sin embargo, cuando se usa en serie, postgres también registra una dependencia de secuencia en la tabla. Entonces, si suelta la tabla creada en el método 1 o 2, también se descarta la secuencia.

+2

La secuencia también se eliminará en el método 3 debido a la instrucción 'owned by'. –

+0

De hecho. Pasé por alto eso. –

Cuestiones relacionadas