В Postgresql сила уникальная по комбинации двух столбцов


192

Я хотел бы настроить таблицу в PostgreSQL так, чтобы два столбца вместе были уникальными. Может быть несколько значений любого значения, при условии, что нет двух, которые совместно используют оба.

Например:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

Так col1и col2можно повторить, но не одновременно. Таким образом, это будет разрешено (не включая идентификатор)

1 1
1 2
2 1
2 2

но не это

1 1
1 2
1 1 -- would reject this insert for violating constraints

Так как это лучший результат поиска в Google, может быть, лучше также предоставить таблицу alter
Существовать

Ответы:


228
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrementэто не postgresql. Вы хотите serial.

Если col1 и col2 делают уникальный и не может быть нулем, то они делают хороший первичный ключ:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)

6
Мне нравится предложение первичного ключа для уникального здесь, потому что мы не допускаем значения NULL в этом случае. Из документов PostgeSQL: «Обратите внимание , что ограничение уникальности не само по себе, обеспечивают уникальный идентификатор , так как он не исключает нулевые значения).» Postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

Как я могу реализовать это в определении схемы?
Wagng

2
В некоторых сценариях может потребоваться, чтобы суррогатный ключ использовался в качестве первичного ключа, а не комбинации столбцов. В частности, для повышения производительности при выполнении объединений на больших объемах данных. Я лично выбрал решение UNIQUE CONSTRAINT ниже.
Алексис.Ролланд

1
Можно ли применить ограничение уникальности только к одной перестановке, например, уникальное (col1, col2 = '1')?
Викрам Хемлани


160

Создайте уникальное ограничение, чтобы два числа вместе НЕ МОГУТ повторяться:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

18

Похоже на обычную УНИКАЛЬНУЮ ОГРАНИЧЕННОСТЬ :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

Больше здесь


1
Это добавляет индекс для aи индекс для cнезависимо? Потому что мне нужно быстро найти на основе aиногда, и быстро найти на основе cиногда.
CMCDragonkai
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.