Как добавить id к первичному ключу в postgresql? - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь вставить данные в базу данных postges в python. Это моя таблица:

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.

Я не знаю, как избавиться от этого идентификатора по умолчанию.

1 Ответ

1 голос
/ 12 июля 2020

Я не уверен в семантике в вашей базе данных, но если это так, как я понимаю, то (для меня) очевидно, что несколько разных рынков могут обрабатывать один и тот же продукт, а также что каждый рынок может обрабатывать более одного продукта. Если это так, то ни market_id, ни product_id не должны быть объявлены UNIQUE в таблице. NOT NULL в порядке, но также не обязательно, поскольку они оба являются частью первичного ключа. Насколько я знаю, Postgresql не допускает значений NULL в первичном ключе. Таким образом, таблица должна быть объявлена:

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_id и product_id относятся к столбцу id в таблицах для рынков и продуктов, и эти столбцы id находятся в первичном ключе соотв. table, я бы также поспорил, чтобы они оба были объявлены как FOREIGN KEY

...