Mysql (php) обновляет или заменяет содержимое корзины в одном запросе с несколькими значениями - PullRequest
0 голосов
/ 05 января 2012

У меня есть текущие таблицы в mysql db для хозяйственной сумки:

BAGS
-----
| bagID         | date_added |         
| primary Key   |            |
------------------------------
| 1             | 2012-01-04 |

BAGS_CONTENT
-----
| ID                  | productID | qyt |
| foreign key->bagID  |           |     |
-----------------------------------------
| 1                   |    103    |  4  |

// $sql Could contain this:

$sql = "(1,103,5),
       (1,101,3)";

INSERT INTO BAGS_CONTENT 
( ID, product_id, qty) 
VALUES
".$sql."

Мне нравится BAGS_CONTENT, чтобы обновить существующую запись (если существует ID и product_id) и добавить новую строку, если не существует (ID и product_id).

Я пытался использовать REPLACE INTO и ON DUPLICATE KEY UPDATE, но не могу заставить его работать.

Может быть, это как-то связано с ключами?
Как вы должны запросить БД в такой ситуации?

Ответы [ 3 ]

1 голос
/ 05 января 2012

Чтобы использовать ON DUPLICATE KEY UPDATE, вам сначала нужно создать уникальный ключ на BAGS_CONTENT (ID, productID)

Затем используйте

INSERT INTO BAGS_CONTENT (ID,productID,qyt) VALUES(1,101,3) ON DUPLICATE KEY UPDATE qyt=VALUES(qyt);
1 голос
/ 05 января 2012

ON DUPLICATE KEY UPDATE запускает инструкцию UPDATE, когда уникальное значение уже существует в таблице.Убедитесь, что вы установили правильные поля, чтобы быть уникальными.Я думаю, вы должны поставить UNIQUE на ID и productID (оба в одном объединенном уникальном):
ALTER TABLE BAGS_CONTENT ADD UNIQUE (ID, product_id)

Ваш запрос должен выглядеть следующим образом:
INSERT INTO BAGS_CONTENT (ID, product_id, qty) ".$sql." ON DUPLICATE KEY UPDATE qty = VALUES(qty);

Более подробная информация о «дубликате ключа»: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

0 голосов
/ 05 января 2012

Вам необходимо создать ключ error , чтобы вызвать специальное поведение REPLACE.Чтобы получить предложенное поведение, добавьте индекс:

mysql> create table bag_content (id INT,productID INT,qty SMALLINT);
mysql> create unique index baggy on bag_content (id,productID);
mysql> replace bag_content values(1,111,5);
mysql> replace bag_content values(1,112,5);
mysql> replace bag_content values(1,111,500);
mysql> select * from bag_content;
+------+-----------+------+
| id   | productID | qty  |
+------+-----------+------+
|    1 |       111 |  500 |
|    1 |       112 |    5 |
+------+-----------+------+

Также обратите внимание: вы используете SQL, поддерживаемый только в MySQL.Уничижение - это «их sql» ... из-за всех нововведений в mysql, которые не проходят процесс стандартизации.Функциональность замены великолепна, но она увеличит барьер для перемещения вашего кода в другие базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...