如何在SQL中忽略重复的主键?

时间:2015-09-30 03:19:10

标签: sql duplicates clone primary-key ignore

我有一个带有几个值的excel表,我将其导入到SQL(book1 $)中,我想将值传输到ProcessList中。有几行具有相同的主键,即ProcessID,因为行包含原始值和修改值,我想保留这两个值。如何让SQL忽略重复的主键?

我尝试了IGNORE_DUP_KEY = ON但是对于具有重复主键的行,只显示了最新一行。

CREATE TABLE dbo.ProcessList
(
    Edited              varchar(1),
    ProcessId           int             NOT NULL PRIMARY KEY WITH (IGNORE_DUP_KEY = ON),
    Name                varchar(30)     NOT NULL,
    Amount              smallmoney      NOT NULL,
    CreationDate        datetime        NOT NULL,
    ModificationDate    datetime
)

INSERT INTO ProcessList SELECT Edited, ProcessId, Name, Amount, CreationDate, ModificationDate FROM Book1$
SELECT * FROM ProcessList

此外,如果我有一行并且我更新了该行的值,是否有任何方法可以保留行的原始值并在下面插入该行的克隆,更新的值和创建/修改日期更新自动?

3 个答案:

答案 0 :(得分:3)

  

如何让SQL忽略重复的主键?

在任何情况下都不能提交事务,导致包含两个具有相同主键的不同行的表。这对于主键的性质至关重要。 SQL Server的IGNORE_DUP_KEY选项不会改变它 - 它只会影响SQL Server 处理问题的方式。 (启用该选项后,它会静默拒绝插入与任何现有行具有相同主键的行;否则,此类插入尝试会导致错误。)

您可以通过删除主键约束或向主键添加一个或多个列来生成集合值不重复的组合键来解决此问题。但是,我没有在你描述的那些人中看到任何有用的扩展PK的候选列。如果放弃PK,那么添加合成的,自动生成的PK柱可能是有意义的。

  

此外,如果我有一行并且我更新了该行的值,是否有任何方法可以保留行的原始值并在下面插入该行的克隆,更新的值和创建/修改日期更新自动?

如果您想确保自动发生这种情况,则会更新一行,然后查看触发器。如果您想要一种自动化方法,但是您愿意让用户询问该行为,那么请考虑一个存储过程。

答案 1 :(得分:0)

删除约束。像这样:

alter table dbo.ProcessList drop constraint PK_ProcessId;

您需要知道约束名称。

换句话说,您不能忽略主键。它被定义为唯一且非null。如果您希望表具有重复项,那么这不是主键。

答案 2 :(得分:0)

试试这个

INSERT IGNORE INTO ProcessList SELECT Edited, ProcessId, Name, Amount, CreationDate, ModificationDate FROM Book1$ SELECT * FROM ProcessList