我在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
和{{1 }})。
我尝试过使用product_id
和REPLACE INTO
,但我无法让它发挥作用。
可能是它与钥匙有关吗?
在这种情况下你应该如何查询数据库?
答案 0 :(得分:1)
ON DUPLICATE KEY UPDATE在表中已存在唯一值时触发UPDATE语句。确保您已将正确的字段设置为唯一。我认为你必须在ID
和productID
上放置一个 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的所有创新都没有通过标准流程。替换功能很棒,但它会增加将代码移动到其他数据库的障碍。