За последние 24 часа нас посетили 22883 программиста и 1311 роботов. Сейчас ищут 913 программистов ...

Сделать 2 поля уникальными, для определённого значения одного из них.

Тема в разделе "PostgreSQL", создана пользователем polin11, 20 мар 2023.

  1. polin11

    polin11 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    20
    Симпатии:
    0
    Использую PGSQL. Есть таблица

    CREATE TABLE forms (
    id serial PRIMARY KEY,
    account INT NOT NULL,
    author text,
    type INT NOT NULL
    );
    INSERT INTO forms(account, author, salary) VALUES
    (1, 'Иванов', 11),
    (2, 'Сидоров', 11),
    (3, 'Сергеев', 12)

    Нужно сделать набор полей (account, type) уникальным только для type = 11.
    Например обе записи нельзя было бы вставить, так как type = 11

    (1, 'Иванов', 11),
    (1, 'Сидоров', 11)

    а например, записи можно было обе вставить, так как type != 11.

    (1, 'Иванов', 12),
    (1, 'Сидоров', 12)


    Как это можно сделать в PGSQL?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.084
    Симпатии:
    1.239
    Адрес:
    там-сям
    Буквально объявить такое нельзя, насколько я знаю. Но можно воспользоваться особенностью уникальных констрейнтов: если хотябы одно из полей содержит null, то вся комбинация полей не проверяется на уникальность.

    То есть можно завести дополнительное поле (вычисляемое), зависимое от type, которое будет равно null если type != 11. И создать правило уникальности
    unique(account, null_if_type_ne_11)