2013-12-12 115 views
1

我想創建一個唯一且限定爲特定值的字段的表。可以說,限制是100,表格已滿,我刪除了一個隨機行,當我創建一個新行時,它具有之前釋放的值。 它不需要成爲世界上最快的東西(極限非常小),我只是想在數據庫中實現它。 任何想法?SQLITE使用唯一的隨機表填充值

回答

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; 
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添加索引,這種方法應該工作快甚至大量的行。

+0

謝謝如果這對我的情況不起作用,它應該引導我走向正確的方向。 – user1032861