Как обеспечить ограничение проверки уникальной комбинации для двух столбцов, но разрешить дублирование в PostgreSQL? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть таблица, скажем:

CREATE TABLE test (
    id SERIAL UNIQUE,
    first integer NOT NULL,
    second integer NOT NULL,
    data text NOT NULL
);

Как применить проверку таким образом, чтобы второй столбец был «уникальным» по отношению к первому столбцу, но допускались повторяющиеся значения?Другими словами, допускается только одно значение во втором для каждого из значений первого столбца.После того, как значение было вставлено в столбец 'first', только дополнительные значения, которые соответствуют существующей (первой, второй) комбинации столбцов, могут быть вставлены снова.

Например, с учетом:

INSERT INTO test (first, second, data) VALUES (1, 2, 'test');

Нарушение ограничения для:

INSERT INTO test (first, second, data) VALUES (1, 3, 'testing');

может произойти, но

INSERT INTO test (first, second, data) VALUES (1, 2, 'testing');

или

INSERT INTO test (first, second, data) VALUES (2, 1, 'testing');

или

INSERT INTO test (first, second, data) VALUES (2, 2, 'testing');

будет успешным.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Проблема в том, что вам нужны две таблицы.Вы пытаетесь переносить информацию из одного ряда в другой, но это плохая идея.Я предполагаю, что у вас действительно есть две сущности, и вы просто не хотите это признавать.

Итак:

CREATE TABLE firstSecond (
    firstSecondId SERIAL PRIMARY KEY,
    first integer NOT NULL,
    second integer NOT NULL,
    constraint unq_firstSecond_first_second unique (first, second)
);

CREATE TABLE test (
    testId SERIAL PRIMARY KEY,
    firstSecondId int not null references firstSecond(firstSecondId),
    data text NOT NULL
);

Эти таблицы имеют семантику, которую вы хотите.

Конечно, вы также можете использовать составной первичный ключ для первой таблицы:

CREATE TABLE firstSecond (
    first integer NOT NULL,
    second integer NOT NULL,
    primary key (first, second)
);

CREATE TABLE test (
    testId SERIAL PRIMARY KEY,
    first int not null,
    second int not null,
    data text NOT NULL,
    foreign key (first, second) references firstSecond(first, second)
);
0 голосов
/ 12 декабря 2018

Составной первичный ключ , если вы ищете комбинацию.

Определение:

Сочетание двух или более столбцов втаблица, которая может быть использована для уникальной идентификации каждой строки в таблице.

Демонстрация = Демонстрация

...