从SQL开始,这个对我来说很棘手。我有4张桌子。我的逻辑问题比我认为的更多。我有一张叫做Vehicle的桌子。在我的应用程序中,此Vehicle表中更改的任何记录都将插入到VLog表中。 Vehicle的主键是VehicleID,它与VLog中的VehicleID相关。在SQL中,我不肯定如何存档这两个表。我有两个存档表。 VehicleArchive和VLogArchive。在我的应用程序中,我能够根据某个参数“存档”某些记录。这很容易,因为我使用gridview并且可以验证VehicleID并将具有该VehicleID的任何记录插入到VLogArchive和VehicleArchive中。但是,我将处理实时记录,并想知道SQL中是否有解决方案。 VLog中的每个VehicleID都有多条记录,因为VLog会跟踪在Vehicle中所做的所有更改。在我的应用程序本身中,单击“更新”按钮,我可以将来自VLog的记录插入到VLogArchive中,方法是将其与gridview中的VehicleID进行比较,然后从VLog中删除所述记录,并将位置更改为“文件室”。 “然后,只要位置为“文件室”,它就会继续将来自Vehicle的记录插入到VehicleArchive中,再次将其与gridview中的VehicleID进行比较。它似乎倒退但我必须这样做,因为如果我在从VLog中删除相关记录之前尝试从Vehicle中删除记录,则它不会删除,因为它是相关的。我不知道如何在SQL中使用这种方法,并且想知道如果位置在“文件室”中,是否有人知道如何同时移动所有记录。
答案 0 :(得分:2)
不要那样做;向表中添加一个存档的int(1)字段,并使用它来过滤视图。
然后将其用作gridview的源
SELECT * FROM Vehicle WHERE Archived=0
要创建存档记录,您可以执行
UPDATE Vehicle SET Archived=1 WHERE ID=1
在生产系统上移动这样的记录绝非易事,而且几乎肯定会导致比您想象的更多的问题。
如果你真的想这样做;然后你将不得不按记录记录;通过复制数据;当然,如果任何其他表引用Vehicle,这将打破您必须手动修复的参照完整性。
您可以在代码中作为后台程序执行此操作,或者(更好)在数据库服务器上使用SQL / SSIS执行此操作
答案 1 :(得分:1)
我不同意@Richard。如果可能的话,我总是倾向于保持你的桌子“精益而且意味着”。如果数据是旧的/未使用的,请将其从生产表中取出!在事务表中保留不必要的记录会带来许多性能和维护风险。由于您要在运行的每个选择查询中包含对该标志的检查(使用@Richard建议的视图),您将不得不将该标志添加到每个非聚簇索引以避免 tipping point问题。您还将遇到独特约束强制执行的问题(如果您的数据库设计得当),以及使查询更容易出错(如果有人编写报告而不使用视图会怎样?)。像这样的元数据标志的问题列表一直在继续。只是不要这样做。
在存档数据上剥离洋葱的方法有很多种。我自己更喜欢更频繁和更小的交易。如果要归档到同一服务器,请在第一个链接中使用T-SQL。如果要归档到其他服务器,请使用SSIS。