Php 插入免费id MYSQL

Php 插入免费id MYSQL,php,mysql,Php,Mysql,我需要能够安全地插入带有第一个可用ID的行。我读了很多关于主键和自动增量以及所有这些内容的答案,但这是另外一回事。我需要保持并能够在固定ID范围从1到60000的数据库上工作。有没有办法用MySQL做到这一点?编写自己的函数来检查最近的空闲ID不是一个选项,因为在多用户使用时可能会有冲突 在最好的情况下,MySQL会以某种方式与主键一起工作,但会重用键。您可以这样尝试: INSERT INTO tableName (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY U

我需要能够安全地插入带有第一个可用ID的行。我读了很多关于主键和自动增量以及所有这些内容的答案,但这是另外一回事。我需要保持并能够在固定ID范围从1到60000的数据库上工作。有没有办法用MySQL做到这一点?编写自己的函数来检查最近的空闲ID不是一个选项,因为在多用户使用时可能会有冲突

在最好的情况下,MySQL会以某种方式与主键一起工作,但会重用键。

您可以这样尝试:

INSERT INTO tableName (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=(Select max(id)+1 from tableName);
有关更多信息:

从表中获取最高id并增加它并插入行

Select max(id) from tableName;
您将获得id,然后将其添加到表中。此外,您可以检查它是否应小于60000

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

< P>遵循以下步骤:

1创建一个列id为rowstate的序列表

2将ID 1-60000插入到具有行状态1的ID中

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

要获取第一个可用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
你可以把它放在手术过程中

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 ;

在编写时,需要协调并发性问题 因此,您需要实现一个表锁机制

一,

2插入记录,您可以只使用auto_increment属性,因为不会同时添加两个值。我认为如果仍然使用该属性,您不必锁定表


3如果您不想使用自动增量,以上建议的任何代码都会起作用

当您按60000次键时会发生什么?为什么会有这样一个任意的限制?只需创建一个带有最后修改的时间戳的表。插入60000行。并更新最旧的记录。如果已经有60000条记录,则不会添加另一条记录。为什么我要更新最旧的?我需要能够插入/删除/修改记录。不仅插入它们…当用户试图对锁定的表执行操作时会发生什么?当用户在表解锁之前断开连接时会发生什么情况?1其他用户将收到一个错误,表示他现在无法访问表,一个正确的代码将处理此错误,然后重试或要求用户重试[请记住,这种情况非常罕见]2当连接断开时,锁被释放,无需担心,除非您使用自己的表锁机制手动处理锁,否则有没有办法让它由MySQL队列处理?我相信是的,请参考非常酷的魔兽世界,它可能会工作。您能否编辑您的答案,使其包含插入延迟信息?我可能会接受这个答案,但必须首先检查它是否真的有效。它仍然存在并发性问题。您可以锁定表。当两个人同时对同一条记录进行操作时会发生什么?使用事务和锁。您可以为事务锁定选择一条记录,以便其他并行进程无法访问该记录。