我想创建一个具有唯一且限于某个值的字段的表。让我们说限制是100,表已满,我删除了一个随机行,当我创建一个新行时,它具有之前释放的值。 它不需要是世界上最快的东西(限制很小),我只想在数据库中实现它。 有什么想法吗?
答案 0 :(得分:2)
在主表中再创建一列,比如deleted
(整数,0或1)。如果您需要使用特定ID进行删除,请不要将其删除,只需将deleted
更新为1:
UPDATE mytable SET deleted=1 WHERE id = <id_to_delete>
当您需要插入时,找到要重复使用的ID:
SELECT id FROM mytable WHERE deleted LIMIT 1
如果此查询返回空结果,则使用INSERT创建新id。否则,只需更新您的行:
UPDATE mytable SET deleted=0, name='blah', ... WHERE id=<id_to_reuse>
从主表中读取的所有查询都应WHERE
约束NOT deleted
条件:
SELECT * FROM mytable WHERE NOT deleted
如果在deleted
上添加索引,则即使对于大量行,此方法也应该快速运行。
答案 1 :(得分:1)
此解决方案可以在触发器中执行所有操作,因此您只需使用普通的INSERT。
对于表本身,我们使用自动增量ID列:
CREATE TABLE MyTable(ID INTEGER PRIMARY KEY, Name);
我们需要另一张表来临时存储ID:
CREATE TABLE moriturus(ID INTEGER PRIMARY KEY);
触发器:
CREATE TRIGGER MyTable_DeleteAndReorder
AFTER INSERT ON MyTable
FOR EACH ROW
WHEN (SELECT COUNT(*) FROM MyTable) > 100
BEGIN
-- first, select a random record to be deleted, and save its ID
DELETE FROM moriturus;
INSERT INTO moriturus
SELECT ID FROM MyTable
WHERE ID <> NEW.ID
ORDER BY random()
LIMIT 1;
-- then actually delete it
DELETE FROM MyTable
WHERE ID = (SELECT ID
FROM moriturus);
-- then change the just inserted record to have that ID
UPDATE MyTable
SET ID = (SELECT ID
FROM moriturus)
WHERE ID = NEW.ID;
END;