PostgreSQL 10: Как добавить уникальный с ограничением и значением по умолчанию -1 - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу добавить уникальные значения с ограничением и значением по умолчанию от -1 до term и oldestyear:

ALTER TABLE live_mytable
    ADD CONSTRAINT live_mytable_uq
    UNIQUE (id,loan_type,coalesce(term,-1),coalesce(oldestyear, -1));

Поскольку моя цель - быть в состоянии оторваться -- вставить, если набор не существует, и обновить столбец apr, если есть конфликт (если набор существует, но значение apr отличается):

INSERT INTO live_mytable(id, loan_type, apr, term, oldestyear) 
SELECT id, loan_type, apr, term, oldestyear
FROM   imp_mytable
  ON CONFLICT (id,loan_type,term,oldestyear) 
  DO UPDATE SET
     apr = excluded.apr;

Причина, по которой мне нужно значение по умолчанию -1 потому, что unique не распознает нулевые значения, а столбцы term и oldestyear могут быть нулевыми.

Я новичок в PostgreSQL, поэтому не уверен, что мой подход верен.

Мой дизайн стола: enter image description here

id       |loan_type      |apr   |term|oldestyear|
---------|---------------|------|----|----------|
    68459|auto new       |  3.50|  48|          |
    68459|auto new       |  3.50|  60|          |
    68459|auto new       |  3.99|  72|          |
    68459|auto used      |  3.24|  36|          |
    68459|auto used      |  3.74|  48|          |
    68459|auto used      |  3.74|  60|          |
    68459|auto used      |  3.99|  72|          |
    10066|auto new       |  2.99|  36|          |
    10066|auto new       |  3.29|  48|          |

Мой вопрос: как я могу перейти от imp_mytable до live_mytable, учитывая, что term и oldestyear может быть нулевым.И обновлять только, если apr отличается, когда уникальный набор совпадает.

1 Ответ

0 голосов
/ 28 февраля 2019

С вашей текущей моделью данных вы не можете, если вы не сделаете это по старому способу с циклом в PL / pgSQL, который пытается и INSERT, и UPDATE, пока один из них не будет успешным.

Возможно, вы можете использовать значение, отличное от NULL, для обозначения пропущенных значений в столбцах, например, -1.Это упростит задачу и упростит некоторые ваши запросы.

...