Дубликат первичного ключа в SQL Server

Я пытаюсь сделать счет для клиентов, которые купили продукты. Я хочу такой же ID_Invoice и внутри будут другие продукты, которые купил клиент.

Я хочу, чтобы это выглядело так,

|ID_Invoice | ID_Reg | ID_Product | ProductType | Price |
+-----------+--------+------------+-------------+-------+
|    1      |   1    |  12345     |  Software   |  300  |
|    1      |   1    |  12346     |  Software   |  400  |
|    2      |   3    |  12347     |  Software   |  350  |
|    3      |   4    |  22346     |  Hardware   |  600  |

Один и тот же покупатель (ID_Reg) может купить 2 разных товара, и это будет в одном счете (ID_Invoice).

Но когда я пытаюсь вставить значения в Invoice, я получаю сообщение об ошибке

Нарушение ограничения PRIMARY KEY «PK_IDInvoice». Не удается вставить повторяющийся ключ в объект «dbo.Invoice». Повторяющееся значение ключа (1).

надеюсь хорошо объяснил

Ваша таблица счетов не допускает таких дубликатов. Похоже, вам нужно два стола для меня.

Gordon Linoff 20.12.2020 15:09

Можете ли вы объяснить мне больше? В двух таблицах будут какие столбцы?

dtaskin 20.12.2020 15:11

Кажется, вам нужно нормализовать свою таблицу (таблицы). Сделав это, вы увидите, в чем проблема, и сможете ее решить. Переходи на НФ3. Это довольно хорошее объяснение нормализации, но не стесняйтесь искать дополнительную информацию. edureka.co/blog/normalization-in-sql

Polygorial 20.12.2020 15:23

Взгляните на стандартные образцы баз данных MS, чтобы увидеть, как «продажи» или «счета» обычно представляют собой базу данных. Обычно вам нужно как минимум 2 таблицы для поддержки такого рода информации. Точно так же, как квитанция, которую вы получаете, когда делаете покупку в магазине, счет-фактура на самом деле представляет собой просто набор одной или нескольких вещей, которые вы покупаете (или продаете). Проектирование баз данных — это совершенно другой навык, чем написание кода для использования базы данных. Я предлагаю вам сначала найти хорошо спроектированную базу данных, если вы только учитесь программировать.

SMor 20.12.2020 15:49

Большое спасибо за помощь! В итоге я создал две таблицы, одна из которых подключается к клиенту, а другая — к продуктам. Это был школьный проект, и в то же время мы должны создать базу данных, а затем dml для этого.

dtaskin 20.12.2020 19:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
153
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужна таблица invoices, в которой каждая строка представляет отдельный счет, а id_invoice является первичным ключом.

Вам нужна таблица invoice_lines или invoice_products, в которой есть одна строка для каждой строки счета (или продукта). Это в основном таблица, которую вы описали выше.

Учитывая ваше описание, (id_invoice, id_product) должен быть уникальным в этой таблице. И id_invoice должен быть ссылкой внешнего ключа на invoices(id_invoice). Обычно я бы также дал такой таблице первичный ключ identity.

dtaskin этот ответ не решает вашу проблему?

bruno 29.12.2020 17:20

Другие вопросы по теме