插入免费的ID MYSQL

时间:2013-11-08 17:24:53

标签: php mysql

我需要能够安全地插入具有第一个可用ID的行。我读了很多关于PRIMARY_KEY和AUTO_INCREMENT以及所有这些东西的答案,但这是其他的东西。我需要保持并能够使用固定ID范围从1到60000的数据库。有没有办法用MySQL做到这一点?编写自己的函数来检查什么是最接近的“免费”ID,不是一个选项,因为多用户使用可能会有冲突。

在最好的情况下,MySQL会像PRIMARY_KEY一样工作,但重用键。

4 个答案:

答案 0 :(得分:1)

请按照以下步骤操作:

1)创建一个包含id, rowstate列的序列表。

2)将ID 1-60000插入包含行状态1的

3)每当要在主表中插入时,从具有rowstate = 1的序列表中搜索最低的id,并将序列更新为-1。 如果要从主表中删除记录,请将id的rowstate设置为1.

答案 1 :(得分:1)

你是写的,你需要解决并发问题 因此你需要实现表锁机制

1)Lock mysql table

2)插入记录,你可以使用auto_increment属性,因为不会同时添加两个值(我不认为你必须锁定表,无论如何使用它)

3)如果你不想使用auto_increment,任何上面建议的代码都可以使用

答案 2 :(得分:0)

您可以尝试这样:

INSERT INTO tableName (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=(Select max(id)+1 from tableName);

了解更多信息:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

从表中获取最高ID并将其增加并插入您的行。

Select max(id) from tableName;

您将获得身份证明。然后添加1并插入表中。此外,您可以检查它应该少于60000。

我知道这不是最佳答案,但可以考虑作为第二种选择。

答案 3 :(得分:0)

要获得免费的第一个id,您可以

select id - (id-ra) as lowest
from
(
  select id, @r := @r + 1 as ra
  from t, (select @r := 0) rank
  order by id
)
x 
where ra <> id
limit 1

SQLFiddle demo

您可以将其放在操作期间lock the table的程序中

delimiter |
CREATE PROCEDURE create_save ()
BEGIN     

    LOCK TABLES your_table WRITE;

    set @lowid := 0;
    select @lowid := id - (id-ra)
    from
    (
      select id, @r := @r + 1 as ra
      from your_table, (select @r := 0) rank
      order by id
    )
    x 
    where ra <> id
    limit 1;

    if @lowid between 1 and 59999
    then
        insert into your_table (id, othercolumn)
        select @lowid, 12345;
    end if;

    UNLOCK TABLES;

end
|
delimiter ;