仅当记录尚不存在时才INSERT INTO查询

Joh*_*ohn 3 mysql sql insert-into

在我的表中,我有两个字段:v_idip_address.我想仅在IP地址尚不存在时才将一些数据插入此表.

谷歌之后我遇到了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;
}
Run Code Online (Sandbox Code Playgroud)

它运行正常且没有错误,但是仍然会生成重复的行,即使将相同的IP作为参数传入也是如此.

有人知道吗?谢谢.

Nul*_*ion 6

你必须创建一个UNIQUE关于指数ip_addressINSERT IGNORE工作:

ALTER TABLE 24h_visits
    ADD UNIQUE INDEX(ip_address)
Run Code Online (Sandbox Code Playgroud)

但是,我还没有看到您的架构的全部内容,但我认为有一个列存储上次访问的时间戳.这是唯一有意义的方法(因此您可以不时地清除超过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();
Run Code Online (Sandbox Code Playgroud)

使用时INSERT IGNORE,永远不会插入新行,因此您将始终拥有第一个插入的值last_visit,这(我看到的方式)并不完全正确.


ale*_*lex 5

UNIQUE约束添加到ip_address列.

如果尝试添加重复ip_address行(除非您使用INSERT IGNORE),您的查询将失败.