Столкнулся с проблемой настройки моей базы данных

#python #sql

#python #sql

Вопрос:

Я делаю проект для CS50x, целью которого является создание базового веб-сайта для торговли акциями, и одной из функций, которые необходимо реализовать, является возможность покупки акций.

У меня есть база данных с двумя таблицами. Один (пользователи) — это таблица с идентификатором, именем пользователя, паролем и наличными. Другая таблица (запасы) должна содержать тот же идентификатор, что и в users, затем символ запаса, а затем количество запасов, так что: идентификатор, символ, сумма.

Что я сделал, так это:

 CREATE TABLE stocks(
    id INTEGER, 
    symbol VARCHAR(10),
    amount INTEGER,
    PRIMARY KEY (id), 
    FOREIGN KEY (id) 
        REFERENCES users (id) 
        ON DELETE CASCADE 
        ON UPDATE NO ACTION);
 

Однако теперь, когда я в своем коде на Python запускаю код для вставки купленных акций в эту таблицу, я сталкиваюсь с проблемой:

 ValueError: UNIQUE constraint failed: stocks.id
 

Идентификатор должен быть уникальным, поэтому я не могу вставить больше, чтобы купить более 1 разных акций с одной учетной записью пользователя. Как мне создать таблицу, в которой идентификатор по-прежнему связан с идентификатором в таблице users, однако я все равно могу добавить несколько разных акций под одним идентификатором?

Комментарии:

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

2. Так было бы ли это лучше?: CREATE TABLE stocks(id INTEGER, user_id INTEGER, symbol VARCHAR(10), amount INTEGER, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE NO ACTION);

Ответ №1:

Я бы попробовал это, у меня есть похожая таблица, и она отлично работает для меня, просто не забудьте указать свой внешний ключ с помощью _fk, чтобы было легче заметить, что это такое

  CREATE TABLE `sites` (
 `id` int(225) NOT NULL AUTO_INCREMENT,
 `userID_fk` int(255) NOT NULL,
 `amount` int(500) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `userID_fk` (`userID_fk`),
 CONSTRAINT `stocks_ibfk_1` FOREIGN KEY (`userID_fk`) REFERENCES `users` (`userID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
 

надеюсь, это сработает для вас