2012-03-16 7 views
4

У меня есть таблица с тремя столбцами (все числовые) с полями CustID (не уникальными), ProdID (не уникальными) и Price. Единственная «уникальность» заключается в том, что никакая пара CustID/ProdID не дублируется. Таким образом, каждый клиент имеет разные «цены» для каждого продукта. Я использую трехлинейный метод. (a) найдите, существует ли пара, (b) если да, я обновляю цену, (c) если нет, я вставляю новую пару с ценой. Я еще не создал индексы для идентификатора (он работает нормально для целей dev.)MySql Обновить поле или Вставить, если не существует, первичный ключ

Может ли кто-нибудь предложить способ использования инструкции REPLACE, большинство примеров INSERT/ON DUPE, по-видимому, подразумевают, что необходим первичный ключ. Обычно у меня всегда есть pk, просто казался расточительным для этого требования. Огромное спасибо всем, кто со временем поможет мне. Ken Ashton

Извините, Майкл, вы уже дали мне пример. Я сейчас получаю голоса, огромное спасибо ребятам

+1

Вы действительно должны создать уникальный индекс для 'CustID/ProdID', а не для целей производительности, для поддержания целостности. –

+1

'CREATE INDEX idx_unique_custprod ON tblname (CustID, ProdID)' –

+3

Или еще лучше создать их как PK: 'ALTER TABLE tblname ADD PRIMARY KEY (CustID, ProdID)' –

ответ

3

Как предложил Майкл и Тони, ПК никогда не пропадает даром. Поэтому всегда стоит иметь ПК в каждом столе. Поэтому я сначала предложил вам создать ПК, а затем использовать INSERT ON DUPLICATE KEY.

Для достижения того, что вы хотите без ПК, вы можете сначала выполнить DELETE, а затем INSERT. На самом деле это то, что делает REPLACE внутри.

+0

Спасибо, ребята. Я новичок, я действительно ценю необходимость ссылочной целостности, просто думал, что это слишком просто, чтобы испортить, но вы укрепили значение для меня. Не могли бы вы привести мне пример объединения двух полей non.unique id в одно уникальное поле, я этого никогда не делал и, возможно, покажу, как это используется в команде INSERT ON DUPLICATE. Большое спасибо – KenAshton

+1

за создание общего уникального поля, это должно работать - 'ALTER TABLE tableName ADD UNIQUE INDEX idxName (CustID, ProdID);' – Abhay

Смежные вопросы