如果product_id的ip_address不存在但我最好不要创建两个单独的查询,我想插入到同一个表中。我怎样才能实现它?
下面是示例表:
id | product_id | ip_address |
------------------------------
a 11112 8.8.8.8
b 11234 9.9.9.9
我的代码是这样的,但它不起作用。
INSERT INTO `'._DB_PREFIX_.'views`
(SELECT '.$id_product.',"'.$ip_addr.'"
FROM `'._DB_PREFIX_.'views`
WHERE NOT EXISTS (SELECT * FROM
`'._DB_PREFIX_.'views` v WHERE v.id_product ='.$id_product.' AND
t.ip_address ="'.$ip_addr.'"
))'
答案 0 :(得分:9)
您可以使用INSERT IGNORE
或REPLACE
或INSERT ... ON DUPLICATE KEY UPDATE ...
每个都要求您对product_id,ip_address
有唯一约束INSERT IGNORE
INSERT IGNORE INTO products VALUES (null, 111, '8.8.8.8')
如果条目已存在,将忽略插入。
<强>更换强>
REPLACE INTO products VALUES (null, 111, '8.8.8.8')
将执行删除和新插入。
INSERT ... UPDATE
INSERT INTO products VALUES (null, 111, '8.8.8.8')
ON DUPLICATE KEY UPDATE products SET last_modified = NOW()
将尝试插入,如果失败则更新现有记录。
在您的情况下,我认为您应该可以使用INSERT IGNORE
,但是如果您希望在记录已存在的情况下更改其他值,则INSERT ... UPDATE ...
应该可以正常运行。
我通常不建议您使用REPLACE
,除非您真的需要DELETE FROM table WHERE ...
加INSERT INTO TABLE ...
<强>更新强>
这需要(对于此示例)组合产品ip_address的唯一索引。 你可以用
来实现这个目标ALTER TABLE products
ADD UNIQUE INDEX `UIDX_PRODUCT__IP_ADRESS`(product, ipaddress);