我有一个数据库表,用于存储用户的商店列表。我希望每个用户只存储12个商店列表,意味着如果当前user1在表中有12个记录,一旦user1创建新的商店列表,将删除第一个商店列表(最旧的)并且将存储新的商店列表。
ShopList表由ShopListID(PK),UserID(FK)组成,一旦用户插入/删除属于商店列表的任何商店列表项,将通过触发器更新LastUpdatedDate。
我根本不知道如何做到这一点..它是否使用触发器?或存储过程?真的需要帮助......
感谢任何反馈..谢谢...
答案 0 :(得分:1)
您可以通过触发器或程序执行此操作。您还可以在您的服务层/业务ligic层中查询保存时的计数并删除旧记录。我是业务逻辑方法,因为它更可测试并且保持业务逻辑不受触发器或过程的影响,因此我的建议是基于代码的方法。
答案 1 :(得分:1)
我个人将选择查询更改为仅选择前12位,以便控制用户可以看到的内容。
然后我会使用一个按计划运行的数据库作业,删除你不想要的那些。
答案 2 :(得分:1)
我最近遇到过这个问题,这实际上取决于你的“归档”策略。
我所做的是创建了一个存储过程,为每个用户帐户选择要归档的记录元素(我的要求与您的要求非常相似,我必须在用户中选择第31个元素)帐户)。如果您认为它会派上用场,我也可以在这里给您一些代码。
我创建了一个名为XXXX_archive的额外表,它是shopping_list表上架构的克隆。这是为了在用户要求在将来检索他的列表的情况下插入旧的存档记录(这显然是可选的,但会派上用场)。
存储过程找到此记录并将它们插入XXXX_archive表中,然后从XXXX中删除它们。这通过SQL Server代理每晚(或在您认为必要时)运行。
效果是,当用户创建另一个购物清单时,第13个元素不会被删除,但我认为这很好,因为您负责归档策略并可以在您的服务条款中对其进行描述。
我想我应该在这里写下我的经验,因为我几天前就解决了这个问题。
编辑:我的存储过程如下:
INSERT into shopping_lists_archive
SELECT *
FROM shopping_lists
WHERE id in (
select id
from (
SELECT ROW_NUMBER() OVER (
PARTITION BY user_ID
ORDER BY user_ID desc) AS RowNumber,
id, user_ID
FROM shopping_lists c
where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
) t
where rownumber > 12
)
DELETE FROM shopping_lists
WHERE id in (
select id
from (
SELECT ROW_NUMBER() OVER (
PARTITION BY user_ID
ORDER BY user_ID desc) AS RowNumber,
id, user_ID
FROM shopping_lists c
where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
) t
where rownumber > 12
)
你去了 - 它可能与你需要的东西略有不同,因为我根据两个表之间的连接进行归档,并且必须根据你的要求修改我的原始查询。