Mysql(php)在一个查询中更新或替换购物袋内容,具有多个值

时间:2012-01-04 23:01:36

标签: mysql replace

我在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更新现有记录(如果存在IDproduct_id)并添加新行(如果不存在)(ID和{{1 }})。

我尝试过使用product_idREPLACE INTO,但我无法让它发挥作用。

可能是它与钥匙有关吗?
在这种情况下你应该如何查询数据库?

3 个答案:

答案 0 :(得分:1)

ON DUPLICATE KEY UPDATE在表中已存在唯一值时触发UPDATE语句。确保您已将正确的字段设置为唯一。我认为你必须在IDproductID上放置一个 UNIQUE (两者合二为一组):
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

答案 1 :(得分:1)

要使用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);

答案 2 :(得分:0)

您需要创建一个键错误才能触发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 |
+------+-----------+------+

另请注意:您只使用mysql支持的SQL。 pejorative是'他们的sql'...因为mysql的所有创新都没有通过标准流程。替换功能很棒,但它会增加将代码移动到其他数据库的障碍。