Php 插入免费id MYSQL
我需要能够安全地插入带有第一个可用ID的行。我读了很多关于主键和自动增量以及所有这些内容的答案,但这是另外一回事。我需要保持并能够在固定ID范围从1到60000的数据库上工作。有没有办法用MySQL做到这一点?编写自己的函数来检查最近的空闲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
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队列处理?我相信是的,请参考非常酷的魔兽世界,它可能会工作。您能否编辑您的答案,使其包含插入延迟信息?我可能会接受这个答案,但必须首先检查它是否真的有效。它仍然存在并发性问题。您可以锁定表。当两个人同时对同一条记录进行操作时会发生什么?使用事务和锁。您可以为事务锁定选择一条记录,以便其他并行进程无法访问该记录。