postgresql 如何创建表的网址是唯一的取决于id?

a7qyws3x  于 2023-03-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(97)

我已经使用PostgreSQL创建了两个表,使用以下命令:

CREATE TABLE stores (
    id SERIAL PRIMARY KEY,
    store_name TEXT
);

CREATE TABLE products (
    id SERIAL, 
    store_id INTEGER NOT NULL,
    title TEXT,
    image TEXT,
    url TEXT UNIQUE, 
    added_date timestamp without time zone NOT NULL DEFAULT NOW(),
    PRIMARY KEY(id, store_id)
);

ALTER TABLE products
ADD  CONSTRAINT "FK_products_stores" FOREIGN KEY ("store_id")
        REFERENCES stores (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE RESTRICT;

并且我想要实现的是每当我尝试插入URL时,

store_id=1 and url=http://pythonisthebest.com
store_id=2 and url=http://pythonisthebest.com

这不应该返回有一个重复的键值,这意味着我想有一个排序检查,看看何时在特定的store_id中存在一个URL,如果两个URL是相同的store_id,那么我应该得到重复的键错误,但否则,如果store_id是唯一的,URL是相同的,那么它不应该出现任何重复的错误。
我的问题是,使用postgresql是否有可能,或者是否需要用其他方式来处理?
编辑:
当然每当我们有两个相同的

store_id=1 and url=http://pythonisthebest.com
store_id=1 and url=http://pythonisthebest.com

则应返回错误键重复

  • ———————————————————-
    预期:
store_id=1 and url=http://pythonisthebest.com
store_id=2 and url=http://pythonisthebest.com

No duplicate key error

实际:

store_id=1 and url=http://pythonisthebest.com
store_id=2 and url=http://pythonisthebest.com

ERROR:  duplicate key value violates unique constraint "product_url_key"
lb3vh1jj

lb3vh1jj1#

您需要表约束。可以使用

alter table products 
    drop constraint products_url_key,
    add unique(store_id, url);

相关问题