在我的表中有两个字段:v_id
和 ip_address
。仅当 IP 地址尚不存在时,我才想向该表中插入一些数据。
在 Google 之后,我遇到了 INSERT IGNORE INTO
语句,这是我的代码:
public function update_visits($ip_address)
{
$sql = 'INSERT IGNORE INTO `24h_visits` (ip_address) VALUES (?)';
if($this->db->query($sql, array($ip_address)))
{
return TRUE;
}
return FALSE;
}
它运行良好并且没有错误,但仍然会生成重复的行,即使将相同的 IP 作为参数传入也是如此。
有人知道吗?谢谢。
最佳答案
您必须在 ip_address
上创建一个 UNIQUE
索引,INSERT IGNORE
才能工作:
ALTER TABLE 24h_visits
ADD UNIQUE INDEX(ip_address)
但是,我还没有看到您的架构的全部内容,但我假设有一列存储上次访问的时间戳。这是唯一有意义的方法(因此您可以不时清除超过 24 小时的访问)。
在这种情况下,您实际上不需要INSERT IGNORE
,而是INSERT ... ON DUPLICATE KEY UPDATE
反而。假设您有一个名为 last_visit
的列:
INSERT INTO 24h_visits (ip_address, last_visit)
VALUES ('$ip_address', NOW())
ON DUPLICATE KEY UPDATE last_visit = NOW();
使用 INSERT IGNORE
,永远不会插入新行,因此您总是会在 last_visit
上插入第一个值,这(我的看法)不完全正确。
关于mysql - 仅当记录不存在时才插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251683/