我曾经遇到过这个问题几次,我想知道其他人在做什么。
当我创建数据库时,有时我必须定期将数据导入表中,让我们说每天。我通常做的是删除所有记录并重新导入外部数据源中的每条记录。
我需要多次存储与导入记录相关的更多数据,但不是来自原始导入源。通常,这种“额外数据”来自用户输入。因此,我将创建另一个表,其主键与获取导入数据的表的键匹配,并将此附加数据存储在新表中。如果这没有意义,这是一个例子:
在旧的遗留系统中,我们存储员工数据。但是,我需要在无法连接到旧旧系统的Web应用程序中使用此数据。因此,我创建了一个数据库,其中的表格与旧系统中的数据模式相匹配,我每天都会将每条记录导入到此表中。当我进行导入时,我会丢弃每条记录并导入每条记录。
但在我的新系统中,员工可以保存生物。所以在另一个表中,我存储了这个和他们的Id。
只有一个表会更简单,但我不能这样做,因为我会删除导入时其他地方不存在的数据。
另一个坏处是,因为我要删除导入的所有这些记录,所以我无法使用相关数据定义外键约束。
我讨厌以这种方式设计数据库,因为我知道有更好的方法。如果我可以在导入数据时进行更新而不是删除并全部导入数据,那会不会很好?
我正在使用Sql server 2008,但我很想知道可以使用任何RDBMS的策略。
答案 0 :(得分:2)
好吧,当你进行导入时,导入临时表,然后更新生产表中的记录(更新一般意义上的单词:删除已删除的内容,添加新内容,修改更改内容)。 / p>
您可能还想在2008年查看新的MERGE
SQL命令,它可能对这种情况非常有帮助。
答案 1 :(得分:0)
这是我提出的SQL Server 2008合并声明,以帮助我了解当前的情况:
MERGE INTO dbo.Sections as S -- Target
USING dbo.SectionsStaging as SS -- Source
ON S.Id = SS.Id -- Join
WHEN MATCHED THEN -- Record exists in both tables
UPDATE SET
TermCode = SS.TermCode,
CourseTitle = SS.CourseTitle,
CoursePrefix = SS.CoursePrefix,
CourseNumber = SS.CourseNumber,
SectionNumber = SS.SectionNumber,
Capacity = SS.Capacity,
Campus = SS.Campus,
FacultyFirstName = SS.FacultyFirstName,
FacultyLastName = SS.FacultyLastName,
[Status] = SS.[Status],
Enrollment = SS.Enrollment
WHEN NOT MATCHED THEN -- Record exists only in source table
INSERT ([Id],[TermCode],[CourseTitle],[CoursePrefix],[CourseNumber],[SectionNumber],[Capacity],[Campus],[FacultyFirstName],[FacultyLastName],[Status],[Enrollment])
VALUES (SS.[Id],SS.[TermCode],SS.[CourseTitle],SS.[CoursePrefix],SS.[CourseNumber],SS.[SectionNumber],SS.[Capacity],SS.[Campus],SS.[FacultyFirstName],SS.[FacultyLastName],SS.[Status],SS.[Enrollment])
WHEN NOT MATCHED BY SOURCE THEN -- Record exists only in target table
DELETE;
好东西!