mekenix Ответов: 3

Почему я не могу обновить свой первичный ключ


Что я могу сделать, чтобы обновить свой pcode? Есть ли способ обойти это или это просто исправлено, потому что я назначил его в качестве первичного ключа на microsoft Sql server?

cm = new SqlCommand("UPDATE tblProduct SET  pdesc=@pdesc, bid=@bid, cid=@cid, price=@price where pcode like @pcode", cn);

                   cm.Parameters.AddWithValue("@pcode", textpcode.Text);
                   cm.Parameters.AddWithValue("@pdesc", textpdesc.Text);
                   cm.Parameters.AddWithValue("@bid", bid);
                   cm.Parameters.AddWithValue("@cid", cid);
                   cm.Parameters.AddWithValue("@price", price);


Если я поставлю вот так
cm = new SqlCommand("UPDATE tblProduct SET  pdesc=@pdesc, bid=@bid, cid=@cid, price=@price, pcode=@pcode", cn);
я получаю сообщение об ошибке говорящее

"Violation of PRIMARY KEY constraint 'PK_tblProducte'.Cannot insert duplicate key in object 'dbo.tblProduct'.The duplicate key value is(2).The statement has been terminated"


Теперь это открывает новый вопрос. Я действительно удалил таблицу Microsoft SQL Server с именем tblProducte. Я действительно удалил, но кажется, что tblProducte все еще существует где-то, но я не могу видеть таблицу на Microsoft SQL server, так как я удалил ее :D. Может ли это быть настоящей замаскированной проблемой?

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

Я попытался изменить свой код на
cm = new SqlCommand("UPDATE tblProduct (pdesc,bid,cid,price) VALUES(@pdesc,@bid,@cid,@price) WHERE pcode like @pcode ",cn)
но это не имело никакого значения.

Gerry Schmitz

Не вижу, как ваша вторая попытка "ничего не изменила", так как она не касается клавиши (если это действительно pcode). Первичные ключи (по соглашению) обычно заканчиваются на "id", что делает ваш SQL подозрительным.

3 Ответов

Рейтинг:
6

0x01AA

С помощью SQL, о котором вы упомянули

cm = new SqlCommand("UPDATE tblProduct SET  pdesc=@pdesc, bid=@bid, cid=@cid, price=@price, pcode=@pcode", cn);


вы обновляете все праймериз к выборам президента же ценность из-за пропавших без вести WHERE пункт.

Надеюсь, это поможет.


Рейтинг:
24

Patrice T

Цитата:
"Нарушение ограничения первичного ключа 'PK_tblProducte'.Не удается вставить дубликат ключа в объекте 'dbo.tblProduct'.Повторяющееся значение ключа: (2).Выполнение данной инструкции было прервано"

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


mekenix

Да, но в данный момент не используется никакой другой ключ. Как он может иметь дубликат, если есть только 1 ключ?

Patrice T

Это и есть послание.
Проверьте, есть ли еще удаленные записи с ключом.

Рейтинг:
17

OriginalGriff

Посмотрите на сообщение об ошибке: оно говорит, что ограничение не работает из-за дубликата ключа.
Так что проверьте значения:

SELECT * FROM tblProduct
И
SELECT * FROM tblProduct WHERE pcode like @pcode

Также проверьте дизайн таблицы БД (в SSMS щелкните правой кнопкой мыши таблицу и выберите "Script table as ... СОЗДАВАЙТЕ, ЧТОБЫ ... Новое Окно Редактора Запросов")

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


mekenix

Используйте [meknxVT]
ГО

/****** Объект: таблица [dbo].[tblProduct] Дата Написания Сценария: 9.09.2020 11:36:40 ******/
УСТАНОВИТЕ ANSI_NULLS НА
ГО

УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО

Создайте таблицу [dbo].[tblProduct](
[pcode] [varchar](50) NOT NULL,
[штрих-код] [varchar](50) NULL,
[pdesc] [varchar](max) NULL,
[bid] [int] NULL,
[cid] [int] NULL,
[цена] [десятичная дробь](18, 2) ноль,
[кол-во] [int] NULL,
Ограничение [PK_tblProducte] первичный ключ КЛАСТЕРИЗОВАН
(
[приложения в P -] АСК
)С (КАК = ВЫКЛ, STATISTICS_NORECOMPUTE = OFF, ТО ЗНАЧЕНИЕ IGNORE_DUP_KEY = OFF, ТО ПАРАМЕТРЫ ALLOW_ROW_LOCKS = ON, ТО ALLOW_PAGE_LOCKS ИНСТРУКЦИИ =) НА [ОСНОВНОЙ]
) НА [ОСНОВНОЙ] ВЫРАЖЕНИЯХ TEXTIMAGE_ON [ПЕРВИЧНЫЙ]
ГО

ALTER TABLE [dbo].[tblProduct] добавить ограничение [DF_tblProduct_qty] по умолчанию ((0)) для [qty]
ГО

Так в чем же здесь проблема?