У Postgresql, натисніть на унікальну комбінацію двох стовпців


191

Я хотів би встановити таблицю в 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, можливо, краще надати також змінити існування таблиці
ϻαϻɾΣɀО-MaMrEzO

Відповіді:


227
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
У деяких сценаріях ви, можливо, хочете, щоб сурогатний ключ використовувався як основний ключ, а не як комбінація стовпців. Зокрема, для підвищення продуктивності під час приєднання до великих обсягів даних. Я особисто звернувся до рішення УНІКАЛЬНОГО ОБМЕЖЕННЯ нижче.
Alexis.Rolland

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.