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

4 sql primary-key duplicates

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ger 5

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

在任何情况下,提交的事务都不能导致表中包含两个具有相同主键的不同行。这是主键本质的基础。SQL Server 的IGNORE_DUP_KEY选项不会改变这一点——它仅仅影响SQL Server处理问题的方式。(打开该选项后,它会默默地拒绝插入与任何现有行具有相同主键的行;否则,此类插入尝试会导致错误。)

您可以通过删除主键约束或向主键添加一列或多列以生成其集合不重复的复合键来解决这种情况。不过,在您描述的那些列中,我没有看到任何好的候选列来扩展 PK。如果您删除 PK,那么添加一个合成的、自动生成的 PK 列可能是有意义的。

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

如果您想确保这种情况自动发生,但恰好有一行被更新,那么请查看触发器。如果您想要一种使其自动化的方法,但又愿意让用户请求该行为,那么请考虑存储过程。