【问题标题】:ERROR: pq: there is no unique or exclusion constraint matching the ON CONFLICT specification错误:pq:没有与 ON CONFLICT 规范匹配的唯一或排除约束
【发布时间】:2021-12-21 21:11:24
【问题描述】:

我有一个如下所示的访问者表结构,并且我已经为这个表创建了 upsert 过程。当我调用该过程时,它返回ERROR: pq: there is no unique or exclusion constraint matching the ON CONFLICT specification。任何人都可以建议所需的更改。


CREATE TABLE visitors
(
    id               SERIAL    NOT NULL,

    facebook         TEXT      DEFAULT NULL,
    github           TEXT      DEFAULT NULL,
    linkedin         TEXT      NOT NULL,
    twitter          TEXT      DEFAULT NULL
);

ALTER TABLE visitors ADD CONSTRAINT visitors_primary_key PRIMARY KEY (id);

ALTER TABLE visitors ADD CONSTRAINT visitors_urls UNIQUE (facebook, github, linkedin, twitter);

upsert 过程:

CREATE OR REPLACE PROCEDURE visitors_upsert
(
    _facebook             TEXT      DEFAULT NULL,
    _github               TEXT      DEFAULT NULL,
    _linkedin             TEXT      DEFAULT '',
    _twitter              TEXT      DEFAULT NULL
)
LANGUAGE SQL
AS $$
    INSERT INTO visitors
    (
        facebook,
        github,
        linkedin
    )
    VALUES
    (
        _facebook,
        _github,
        _linkedin,
        _twitter
    )
    ON CONFLICT (linkedin)
    DO UPDATE 
    SET
        facebook = _facebook,
        github = _github,
        twitter = _twitter
$$;
CALL visitors_upsert('facebook', 'github', 'linkedin', 'twitter')

演示:https://dbfiddle.uk/?rdbms=postgres_13&fiddle=21ed4fa7526a0744feecbbe43f8944f6

【问题讨论】:

    标签: sql postgresql stored-procedures upsert


    【解决方案1】:

    linkedin 没有唯一约束。要么创建一个,要么使用INSERT ... ON CONFLICT以外的其他东西。

    【讨论】:

    • 我有这个独特的约束:ALTER TABLE visitors ADD CONSTRAINT visitors_urls UNIQUE (facebook, github, linkedin, twitter);,这还不够吗?
    • 没有。这使得这四个值的组合是唯一的,但不是每一列。
    • 我认为每一列都是独一无二的。
    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2016-08-03
    • 2018-06-22
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多