В 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
PearsonArtPhoto
источник
Так как это лучший результат поиска в 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')?
Викрам Хемлани
postgres: stackoverflow.com/questions/16236365/… sql сервер: stackoverflow.com/a/5149263/5986661
Омкар Неоги
160

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
djangojazz
источник
18

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

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

Больше здесь

Тимур Садыков
источник
1
Это добавляет индекс для aи индекс для cнезависимо? Потому что мне нужно быстро найти на основе aиногда, и быстро найти на основе cиногда.
CMCDragonkai