“了解” SQL 的人会寻找声明式解决方案,并且会避开过程代码。标记行是程序代码的“气味”。
Items 的集合是静态的(从不改变)还是稳定的(很少改变)?如果是,那么从现在到结束进行一次生成值查找表的一次性练习会更容易,而不是安排一个 proc 每天运行以查找未使用的标志并更新今天的标志并清除如果所有标志都已使用等,则所有标志。
创建一个从今天到遥远未来日期之间的连续日期表,代表您的应用程序的生命周期(当然,您可以考虑省略非工作日)。在Items 表中添加一个引用键的列(确保选择ON DELETE NO ACTION 引用操作,以防那些Items 证明不是静态的!)然后随机分配整组Items 一个每天一次,直到每个都用过一次。对整组Items 再次重复,直到表已满。您可以使用电子表格轻松生成这些数据并将其导入(如果您是铁杆,则可以使用纯 SQL;)
使用标准 SQL 的快速示例:
假设集合中只有五个Items:
CREATE TABLE Items
(
item_ID INTEGER NOT NULL UNIQUE
);
INSERT INTO Items (item_ID)
VALUES (1),
(2),
(3),
(4),
(5);
你的查找表就这么简单:
CREATE TABLE ItemsOfTheDay
(
cal_date DATE NOT NULL UNIQUE,
item_ID INTEGER NOT NULL
REFERENCES Items (item_ID)
ON DELETE NO ACTION
ON UPDATE CASCADE
);
从今天开始,随机添加整套Items:
INSERT INTO Items (item_ID)
VALUES ('2010-07-13', 2),
('2010-07-14', 4),
('2010-07-15', 5),
('2010-07-16', 1),
('2010-07-17', 3);
然后,从最近的未填写日期开始,以随机顺序(希望是不同的)添加整组Items:
INSERT INTO Items (item_ID)
VALUES ('2010-07-18', 1),
('2010-07-19', 3),
('2010-07-20', 4),
('2010-07-21', 5),
('2010-07-22', 2);
...再一次...
INSERT INTO Items (item_ID)
VALUES ('2010-07-23', 2),
('2010-07-24', 3),
('2010-07-25', 5),
('2010-07-26', 1),
('2010-07-27', 4);
..以此类推,直到桌子满为止。
那么这将只是在需要时在查找表中查找今天的日期的情况。
如果Items 的集合发生变化,那么查找表显然需要重新生成,因此您需要在设计的简单性与手动维护的需要之间取得平衡。