0

如果 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.'"
))'
4

2 回答 2

14

您可以使用INSERT IGNOREREPLACEINSERT ... ON DUPLICATE KEY UPDATE ...

每个都要求您对 product_id、ip_address 有唯一的约束

插入忽略

INSERT IGNORE INTO products VALUES (null, 111, '8.8.8.8')

如果条目已经存在,将忽略插入。

代替

REPLACE INTO products VALUES (null, 111, '8.8.8.8')

将执行删除和新插入。

插入...更新

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);
于 2013-06-20T06:40:56.280 回答
2

您可以在SQL-Fiddle中测试解决方案。

下面是示例插入语句。

insert into temp
(select 2,101,'2.2.2.2'
from dual
where not exists (select * from Temp t 
              where t.product_id = 101 and
                    t.ip_address = '2.2.2.2'));
于 2013-06-20T06:48:27.017 回答