【问题标题】:SQL Server allow duplicates in any column, but not all columnsSQL Server 允许在任何列中重复,但不是所有列
【发布时间】:2017-10-31 21:48:12
【问题描述】:

我已经搜索了许多线程以试图找到这个问题的答案,但我发现的任何答案都建议在单个列或多个列上使用唯一约束。

我的问题是,我正在用 C# 编写一个带有 SQL Server 后端的应用程序。其中一项功能是允许用户在经过一点预处理后将.CSV 文件导入数据库。我需要找到最快的方法来防止用户多次导入相同的数据。数据看起来像

ID   -- will be auto-generated in SQL Server (PK)
Date Time(datetime)
Machine(nchar)
...
...
...
Name(nchar)
Age(int)

我想允许任意数量的列是重复值,只要整个记录不是。

我正在考虑在数据库中创建另一列,通过将所有列散列在一起并使其唯一获得,但想确定这是否是最有效的方法,或者生成的散列是否可以保证唯一。 CSV 文件只有 60 MB 左右,但会有数万个。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 将文件插入临时表并使用 SQL Merge 或从那里插入 where not exists 语句?
  • 你能插入临时表吗?如果不能,您可以使用类似 OPENDATASOURCE 的方法从 CSV 中查询数据吗?

标签: c# sql-server linq-to-sql


【解决方案1】:

您应该能够通过创建一个包含所有列的唯一约束来解决此问题。

create table #a (col1 varchar(10), col2 varchar(10))

ALTER TABLE #a 
    ADD CONSTRAINT UQ UNIQUE NONCLUSTERED
        (col1, col2)

-- Works, duplicate entries in columns
insert into #a (col1, col2)
    values   ('a', 'b')
            ,('a', 'c')
            ,('b', 'c')


-- Fails, full duplicate record:
insert into #a (col1, col2)
    values   ('a1', 'b1')
            ,('a1', 'b1')

【讨论】:

  • 谢谢,简单但有效。我不知道为什么我没有想到这一点。
【解决方案2】:

下面的代码可以确保您在插入数据时不会重复 [Date Time]、Machine、[Name] 和 Age 列。

确保在运行代码时,传入数据集的每一行都有一个唯一的 ID,这一点很重要。此代码无法移动选择 ID 的任何行,因为所有其他四个值已在目标表中重复。

INSERT INTO MAIN_TABLE ([Date Time],Machine,[Name],Age)
SELECT [Date Time],Machine,[Name],Age
FROM IMPORT_TABLE WHERE ID NOT IN
(
SELECT I.ID FROM IMPORT_TABLE I INNER JOIN MAIN_TABLE M 
ON I.[Date Time]=M.[Date Time] 
AND I.Machine=M.Machine 
AND I.[Name]=M.[Name] 
AND I.Age=M.Age
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多