mysql - 仅当记录不存在时才插入查询

标签 mysql sql insert-into

在我的表中有两个字段:v_idip_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/

相关文章:

mysql - 数据库列中的文本搜索

mysql - 如何使用 StartTime(varchar) 和 EndTime(varchar) 在 MySQL 中搜索记录?

mysql - Handlebars js 不呈现 mysql 查询返回的对象数组(在 nodejs 服务器中)

php+mysql : how to read several time results of query

sql - MS Access SQL 插入到不存在记录的表中

php - 使用php中动态创建的单选按钮的onclick标签更改图像

python - 如何访问 SQLAlchemy 结果中具有相同名称的字段

mysql - 一对一的关系

mysql - 一起插入(选择和值)

oracle - 没有列的插入语句是否在 Oracle 中批准性能