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

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

   REPLACE INTO inventory(username, sku,asin,set_price,inventory)
                   VALUES('trav','AEG5502','B00875JE0C','23.49','');

Но вместо удаления старой строки он создает новую строку с точно такой же информацией.

Я уверен, что это простая ошибка, но я был бы рад, если бы кто-нибудь мог мне помочь.

Дополнительная информация, в строке около 15 столбцов. Ни один из этих столбцов (username, sku, asin, set_price,inventory) не является primary key, я не знаю, должно ли это быть так для заменить на работу, но я подумал, что упомяну об этом.

Благодарность

2
user1556695 20 Мар 2013 в 10:42
REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки.
 – 
hank
20 Мар 2013 в 10:44
1
Не по теме. Но я вижу, вы вставляете имя пользователя в строку. Разумнее включать user_id вместо имени. Что если имя пользователя изменится?
 – 
Bart
20 Мар 2013 в 10:46
@bart: при правильной настройке внешнего ключа вы можете каскадировать такое изменение.
 – 
Marc B
20 Мар 2013 в 17:54

1 ответ

Лучший ответ

RTLM: http://dev.mysql.com/doc/refman/5.0 /en/replace.html replace будет заменять только в том случае, если ЛЮБОЕ из используемых вами полей является основным или, по крайней мере, уникальным ключом в таблице. поскольку ни одно из ваших полей не заполнено, он просто вставляет

4
Marc B 20 Мар 2013 в 10:44
Блин, думаю, я не подумал об этом, когда настраивал базу данных. Спасибо за помощь! Есть ли способ имитировать уникальность артикула, если имя пользователя = trav? Я предполагаю, что у некоторых пользователей будут такие же номера SKU.
 – 
user1556695
20 Мар 2013 в 11:06
Наугад: поставить уникальный индекс на кортеж (username, sku)?
 – 
Marc B
20 Мар 2013 в 17:54