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

4

我有一个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

另外,如果我有一行数据并更新该行的值,是否有办法保留该行的原始值,并自动插入一个克隆行,包含更新后的值和创建/修改日期?


我建议将数据加载到一个没有约束条件的临时表中。然后进行进一步处理,将数据加载到一个带有主键和其他约束条件的表中。在此过程中处理重复数据。 - siride
一个进程可以被编辑多少次?作为 varchar(1),我猜可能只能编辑一次?如果是这样,也许你的主键实际上是 Edited 和 ProcessId 的组合。例如:PRIMARY KEY (Edited, ProcessId) 而不是在单个列上定义主键。 - wwkudu
3个回答

5
如何使SQL忽略重复的主键?
绝不允许提交包含两个具有相同主键的不同行的事务。这是主键性质的基本要求。SQL Server的IGNORE_DUP_KEY选项并不能改变这一点,它只是影响SQL Server处理问题的方式。(打开该选项后,它会自动拒绝插入与任何现有行具有相同主键的行;否则,这样的插入尝试将导致错误。)
你可以通过删除主键约束或添加一个或多个列到主键中来解决这个问题,以产生一个集体值不重复的组合键。然而,在所描述的列中,我没有看到任何适合扩展PK的好候选列。如果您删除了PK,则增加一个合成的、自动生成的PK列可能是有意义的。
此外,如果我有一行数据并更新了该行数据,是否有任何方法可以保留该行的原始值,并在下面插入该行的克隆副本,同时自动更新更新的值和创建/修改日期?
如果您想确保无论如何更新行都发生自动化,请查看触发器。如果您想要一种自动化的方法,但愿意让用户要求这种行为,则考虑存储过程。

如果您无法删除主键(例如,用作外键约束),创建一个复合主键是解决此问题的绝佳方法。谢谢@John! - SuN

0

试试这个

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


-1
你要删除限制。像这样:
alter table dbo.ProcessList drop constraint PK_ProcessId;

你需要知道约束名。

换句话说,你不能忽略主键。它被定义为唯一的且非空的。如果你想让表中有重复的内容,那么这就不是主键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接