Frankie-10589807 Ответов: 2

Как вставить определенное значение несколько раз в значение первичного ключа БД


Я работаю с розничным приложением, и каждый раз, когда я пытаюсь ввести определенный продукт с одним и тем же кодом продукта несколько раз в одной продаже, я получаю ошибку: "нарушение ограничения первичного ключа. не удается вставить дубликат ключа'

Любая помощь в этом вопросе будет высоко оценена.
Спасибо.

Что я уже пробовал:

Я удалил первичный ключ из поля productcode в базе данных. Это не сработало.

Вот функция, которая сохраняет заказ на продажу в базе данных:

"
Public Shared Function SaveOrder(ByVal newOrder As EkOrderClass) As Integer

        GetCon()
        opencon()

        Dim TR As SqlClient.SqlTransaction = con.BeginTransaction
        CMD.Transaction = TR
        cmd.CommandText = "INSERT TBL_ORDER (EmpID, OrderDate, OrderTime) VALUES (@EmpID, @orderDate, @OrderTime);SELECT Scope_Identity()"
        cmd.Parameters.Clear()

        cmd.Parameters.AddWithValue("@EmpId", frmSales.lblUser.Text)
        cmd.Parameters.AddWithValue("@orderDate", Today)
        cmd.Parameters.AddWithValue("@OrderTime", frmSales.lblTime.Text)

        Dim OrderID As Int32
        Try
            OrderID = System.Convert.ToInt32(cmd.ExecuteScalar)
            MyOrderId = OrderID
        Catch ex As Exception
            TR.Rollback()
            closecon()
            Throw ex
        End Try

        For Each det As EkOrderDetail In newOrder.Details
           
            cmd.CommandText = "INSERT [TBL_ORDER_DETAILS] (OrderID, ProductCode, UnitPrice, Quantity) VALUES (@OrderID, @productCode, @price, @quantity)"
            CMD.Parameters.Clear()
            cmd.Parameters.AddWithValue("@orderID", MyOrderId)
            cmd.Parameters.AddWithValue("@productCode", det.ProductCode)
            CMD.Parameters.AddWithValue("@price", det.ProductPrice)
            CMD.Parameters.AddWithValue("@quantity", det.ProductQuantity)
            
            Try
                CMD.ExecuteNonQuery()
            Catch ex As Exception
                TR.Rollback()
                closecon()
                Throw ex
            End Try
        Next

        TR.Commit()
        closecon()
        Return OrderID
    End Function



Я пытался установить
IGNORE_DUP_KEY = ON
но это исключает из деталей заказа любые элементы, вставленные несколько раз.


Пожалуйста помочь
Спасибо

Graeme_Grant

Поле первичного ключа предназначено только для уникальных значений. Удаление его перед добавлением в таблицу не исправит ситуацию. Вам нужно изменить схему таблицы, чтобы изменить ее поведение.

2 Ответов

Рейтинг:
15

OriginalGriff

Первичный ключ всегда имеет ограничение UNIQUE: это означает, что вы никогда не можете иметь более одной строки с определенным значением. Когда вы пытаетесь это сделать, вы получаете сообщение об ошибке:

Violation of primary key constraint. cannot insert duplicate key
В вашем случае это означает, что ваш дизайн базы данных неверен: у вас должно быть как минимум две таблицы:
Продукты:
ID(primary key)    Description
SK0012             Set of big plastic bananas (6)
SK0013             Set of big plastic bananas (12)
SK0142             Elephant, live, 3 tonnes.
И таблица продаж:
Продажи:
ID      ProdID   Date        Quantity    TotalPrice
1001    SK0013   2017-03-31  5           100.00
1002    SK0012   2017-03-31  2           20.00
1003    SK0013   2017-04-01  1           20.00
1004    SK0013   2017-04-01  5           100.00

продажа.Поле ID - это поле идентификации, которое SQL будет поддерживать для вас.

Есть смысл?


Да, сэр, в этом есть большой смысл. Но в моем случае у меня есть две таблицы для системы заказа, то есть таблицы заказа и деталей заказа

Order
IrderId int NotNull ----------->Primary Key
EmpId Varchar(50) notnull
OrderDate date notnull
OrderTime nchar(20) null
-----------------------------------------
OrderDetails
OrderId int notnull -----------------> Primary Key
ProductCode int notnull -------------> Primary Key
UnitPrice decimal(18,0) notnull


Это неправильно. Таблица может иметь только один первичный ключ, точно так же, как гонка имеет только одного победителя. Вам нужно три стола:
Заказы
Заказано
Продукты

Попробовать это:
Заказы
Id int NotNull ----------->Primary Key
EmpId Varchar(50) notnull
OrderDate DATETIME notnull

Заказано
Id int notnull ----------> Primary Key
OrderId int NotNull -----> Foreign key to Orders.ID
ProdID int notnull ------> Foreign key to Products.ID
Quantity INT NotNull
TotalPrice decimal(18,0) notnull

Продукты
Id int notnull ----------> Primary Key
Desc NVARCHAR(256)
UnitPrice decimal(18,0) notnull


Frankie-10589807

Да, сэр, в этом есть большой смысл. Но в моем случае у меня есть две таблицы для системы заказа, то есть таблицы заказа и деталей заказа

Заказ
IrderId NotNull -----------&инт ГТ;первичный ключ
Empid в тип varchar(50) notnull
Дата заказа notnull
OrderTime nchar(20) null
-----------------------------------------
Заказано
OrderId int notnull -----------------> первичный ключ
ProductCode int notnull -------------> первичный ключ
UnitPrice decimal (18,0) notnull

Когда я удаляю поле ProductCode из списка первичных ключей, приложение не может вставить заказ, состоящий из нескольких продуктов.

OriginalGriff

Ответ обновлен

Frankie-10589807

Я смог пройти через этот вызов!

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

Спасибо Вам за вашу помощь.

Frankie-10589807

Большое вам спасибо за помощь. я имею в виду, что первичный ключ таблицы состоит из двух полей, то есть полей ProductCode и OrderId. Но когда я отключил ProductCode от первичного ключа и добавил ProductRowId, сделав его столбцом идентификатора, то добавил vb.net код для размещения поля. Это решило проблему, хотя и не соответствовало нормам и этике программирования. тем не менее, ваша идея тоже в порядке, потому что я тоже попробовал ее, и она работает нормально. У моего дизайна базы данных была ошибка.

Снова,
Большое спасибо боссу за помощь.

OriginalGriff

Пожалуйста!

Рейтинг:
1

Patrice T

Цитата:
Как вставить определенное значение несколько раз в значение первичного ключа БД

А ТЫ-НЕТ !
По замыслу первичный ключ допускает только уникальные значения. Каждое значение имеет значение только 1 раз.
Одно и то же значение несколько раз допускается только в непервичном ключе.
Это SQL 101 !
Проблема заключается в дизайне вашей базы данных.


Frankie-10589807

большое спасибо.