【问题标题】:sql which is better to insert row if not exist before如果之前不存在,最好插入行的sql
【发布时间】:2012-02-29 09:36:48
【问题描述】:

当一列不存在时,我目前正在使用以下方法在表中插入一行..否则我会生成新的列ID并重试

    $item_id = $this->misc_model->generateId(18);

    while ($flag == false){

        $this->db->where('item_id', $item_id);
        $sql = $this->db->get($this->db->dbprefix('table'));

        if ($sql->num_rows()){
            $item_id = $this->misc_model->generateId(18);
        }else{
            $flag = true;
        }
    }

这样可以更快完成吗?

 IF NOT EXISTS(SELECT 1 FROM table WHERE item_id = $item_id)
    INSERT INTO table (item_id) VALUES ($item_id)

【问题讨论】:

  • 也许在item_id 上创建一个唯一索引并尝试插入直到成功...理论上这可能需要很长时间并且效率不高,但我认为上述方法容易出现竞争条件。 ..

标签: php mysql sql insert


【解决方案1】:

如果 item_id 是您的主键,那么您最好使用 AUTO INCREMENT 并让数据库为您处理。

【讨论】:

  • item_id 由函数 generateId() 生成...表也有一个列 (id) 是 AUTO_INCREMENT
  • @fxuser 好的,您可能需要更详细地解释您的意图。听起来您正在尝试为每一行创建另一个唯一标识符。这有点没有意义。 item_id 是什么,它代表什么?
  • item_id 是为每一行创建的唯一 id,除了 id(auto_increment) 它实际上是一个随机的 18 长度整数
  • 看来我不需要 item_id 列,只有 auto_increment 的 id 也可以完成这项工作。所以我不需要使用 while 循环来做什么,对吧?
  • @fxuser 如果您不需要 item_id,那么只需插入行并获取自动增量并使用它。应该不需要你的其他代码。
【解决方案2】:

如果您愿意始终使用新的 item_id,那么您可以在插入语句中尝试此操作

INSERT INTO table_name (item_id) value (RIGHT(CONCAT(UNIX_TIMESTAMP(),UNIX_TIMESTAMP()),18))

这将始终为您生成新的 item_id

【讨论】:

    【解决方案3】:

    你应该让你的列自动递增,但如果由于某种原因你不能,那会更快,是的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 2023-03-21
      • 2012-11-14
      • 1970-01-01
      • 2014-01-25
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多