SQL Server允许在任何列中复制,但不能在所有列中复制

时间:2017-10-31 21:48:12

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

我搜索了很多线程,试图找到答案,但我发现的任何答案建议在单个列或多列上使用唯一约束。

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

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

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

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

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:2)

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

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')

答案 1 :(得分:1)

下面的代码可以确保您在插入数据时不会复制[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
)