我需要能够安全地插入具有第一个可用ID的行。我读了很多关于PRIMARY_KEY和AUTO_INCREMENT以及所有这些东西的答案,但这是其他的东西。我需要保持并能够使用固定ID范围从1到60000的数据库。有没有办法用MySQL做到这一点?编写自己的函数来检查什么是最接近的“免费”ID,不是一个选项,因为多用户使用可能会有冲突。
在最好的情况下,MySQL会像PRIMARY_KEY一样工作,但重用键。
答案 0 :(得分:1)
请按照以下步骤操作:
1)创建一个包含id, rowstate
列的序列表。
2)将ID 1-60000
插入包含行状态1的
3)每当要在主表中插入时,从具有rowstate = 1的序列表中搜索最低的id,并将序列更新为-1。 如果要从主表中删除记录,请将id的rowstate设置为1.
答案 1 :(得分:1)
你是写的,你需要解决并发问题 因此你需要实现表锁机制
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
您可以将其放在操作期间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 ;