PostgreSQL дублирует строки с двумя дубликатами столбцов

В PostgreSQL я ищу ответ на следующую проблему. Есть два столбца, содержащие данные о «начале» и «конце», а также столбец «дата». В настоящее время столбец даты существует только один раз, а «начало» и «конец» заполнены возможностями.

Я ищу возможность создать столбец «начало» и «конец» с уникальными значениями, но с дублирующими датами.

Текущий:

id  date          start    end
1   2017-03-13    a        [null]
2   2017-03-14    [null]   a
3   2017-03-14    b        [null]
4   2017-03-16    [null]   b
5   2017-03-16    c        c

желание:

id  date          start    end
1   2017-03-13    a        [null]
2   2017-03-14    [null]   a
3   2017-03-14    b        [null]
4   2017-03-16    [null]   b
5   2017-03-16    c        [null]
6   2017-03-16    [null]   c

У кого-нибудь есть идея?


person aptroost    schedule 15.03.2017    source источник
comment
создать уникальный индекс для начального и конечного столбцов.   -  person VynlJunkie    schedule 15.03.2017
comment
Спасибо за вашу реакцию Mokadillion. Когда я это делаю, я получаю сообщение об ошибке «ОШИБКА: не удалось создать уникальный индекс test_idx DETAIL: ключ (начало, конец) = (c, c) дублируется». Это то, что я ожидаю, но не понимаю, как это может решить мою проблему.   -  person aptroost    schedule 15.03.2017
comment
как показано ниже, конец является ключевым словом и должен быть заключен в двойные кавычки, лучше использовать другое имя.   -  person VynlJunkie    schedule 15.03.2017


Ответы (1)


Если я правильно понял вашу проблему, и вы хотите, чтобы было задано ровно одно из start и "end", а комбинация с date уникальна, то можно сделать так:

ALTER TABLE tab
   ADD CHECK(start IS NULL AND "end" IS NOT NULL
          OR start IS NOT NULL AND "end" IS NULL);

CREATE UNIQUE INDEX ON tab (date, COALESCE(start, "end"));
person Laurenz Albe    schedule 15.03.2017