Есть ли разница в способе определения первичного ключа в Postgres? - PullRequest
6 голосов
/ 15 февраля 2011

Мне интересно, все ли они одинаковы или есть какая-то разница.

Метод 1:

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

Метод: 2

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

Метод 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;

Обновление: Я нашел в сети что-то, говорящее, что с помощью необработанной последовательности вы можете предварительно выделить память для первичных ключей, что поможет, если вы планируете выполнить несколько тысяч вставок в следующую минуту.

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

Попробуйте и посмотрите;удалите завершающие "," после "варьирования" на втором и третьем, чтобы они выполнялись, выполните каждое из них, затем выполните:

\d testtable

после каждого, и вы сможете увидеть, что происходит.Затем бросьте стол и переходите к следующему.Это будет выглядеть так:

 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)

Первый и второй почти идентичны, за исключением того, что созданный первичный ключ имеет разные имена.В-третьих, последовательность больше не заполняется при вставке в базу данных.Сначала необходимо создать последовательность, а затем создать таблицу следующим образом:

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

Чтобы получить нечто, похожее на второе.Единственный плюс в том, что вы можете использовать директиву CACHE для предварительного выделения некоторого количества порядковых номеров.Это может быть достаточно большой ресурс ресурсов, что вам нужно, чтобы снизить конкуренцию.Но вам нужно будет делать несколько тысяч вставок в секунду, а не в минуту, прежде чем это произойдет.

3 голосов
/ 15 февраля 2011

Нет семантической разницы между методом 1 и методом 2.

Метод 3 тоже очень похож - это то, что происходит неявно, при использовании последовательного интерфейса. Однако при использовании serial postgres также записывает зависимость последовательности от таблицы. Таким образом, если вы отбрасываете таблицу, созданную в методе 1 или 2, последовательность также удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...