如何将 id 添加到 postgresql 中的主键?

How to add id to a primary key in postgresql?

我正在尝试将数据插入 python.This 中的 postges 数据库是我的 table:

CREATE TABLE IF NOT EXISTS fp_stores_data_test (
    time INTEGER,
    province VARCHAR(20),
    city VARCHAR(20),
    market_id INTEGER UNIQUE NOT NULL,
    product_id INTEGER UNIQUE NOT NULL,
    price INTEGER, 
    quantity INTEGER,
    has_sold INTEGER,
    PRIMARY KEY (time, city, province, market_id ,product_id)
);

这是我的 python 函数,它试图将数据添加到数据库:


def add_data_to_db(cursor, address):

    list_of_files = listdir(address)
    for file_ in list_of_files:
        f = open(address+file_, "r")
        for line in f:
            data = line.split(",")
            query = "INSERT INTO fp_stores_data_test "\
                    "VALUES ({},'{}','{}',{},{},{},{},{})"\
                    .format(data[0],data[1],data[2],data[3]
                            ,data[4],data[5],data[6],data[7])
            cursor.execute(query)
            print(data)

但是出现这个错误:

psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "fp_stores_data_test_market_id_key"
DETAIL:  Key (market_id)=(1) already exists.

我不知道如何删除该默认 ID。

我不确定你的数据库中的语义,但如果它是我所理解的,那么(对我来说)很明显,几个不同的市场可以处理相同的产品,而且每个市场可以处理不止一个产品。如果是这种情况,那么 market_idproduct_id 都不应该在 table 中声明为 UNIQUENOT NULL 可以,但也不是必需的,因为它们都是主键的一部分。据我所知,Postgresql 不允许在主键中使用 NULL 值。因此 table 应该声明为:

CREATE TABLE IF NOT EXISTS fp_stores_data_test (
    time INTEGER,
    province VARCHAR(20),
    city VARCHAR(20),
    market_id INTEGER,
    product_id INTEGER,
    price INTEGER, 
    quantity INTEGER,
    has_sold INTEGER,
    PRIMARY KEY (time, city, province, market_id ,product_id)
);

如果 market_idproduct_id 引用 table 中市场和产品的 id 列,并且这些 id 列在 resp 的主键中。 table,我还主张将它们都声明为 FOREIGN KEY