SQLITE用独特的随机表填充值

时间:2013-12-12 11:18:18

标签: sqlite random uniqueidentifier

我想创建一个具有唯一且限于某个值的字段的表。让我们说限制是100,表已满,我删除了一个随机行,当我创建一个新行时,它具有之前释放的值。 它不需要是世界上最快的东西(限制很小),我只想在数据库中实现它。 有什么想法吗?

2 个答案:

答案 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;