2012-02-29 34 views
0

存在..否则,我产生新的列ID,然后再试一次SQL这是更好的插入行,如果不是我目前使用下面的方法在表中插入一行时,一列不存在以前

$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) 
+0

也许创建唯一索引'ITEM_ID '并尝试插入,直到你成功...理论上这可能需要永远,并不是非常有效,但我认为上述方法容易出现竞争条件... – Yaniro 2012-02-29 09:47:25

回答

2

如果ITEM_ID是你的主键,那么你就好得多使用AUTO INCREMENT并让DB您处理该问题。

+0

item_id由函数generateId()...表生成还有一个列(id),它是AUTO_INCREMENT – fxuser 2012-02-29 09:41:00

+0

@fxuser好的,你可能需要解释你的意图有点mor细节。这听起来像你正试图为每一行创建另一个唯一的标识符。这有点无意义。什么是item_id,它代表什么? – liquorvicar 2012-02-29 13:03:49

+0

item_id是为每行创建的惟一id,除了id(auto_increment),它实际上是一个随机的18长度整数 – fxuser 2012-02-29 15:43:57

0

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

1

,如果你是好去一个新的ITEM_ID总是那么您可以在您的INSERT语句

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

试试这个,这将始终产生新ITEM_ID你

相关问题