【问题标题】:SQL INSERT Violation Primary KeysSQL INSERT 违反主键
【发布时间】:2017-12-19 01:18:17
【问题描述】:

我有一个主键由三列组成的表:CODE_TARIF, UNITE, MODE_LIV。在我的表中有MODE_LIV = 2 的三个记录。然后我用MODE_LIV = 4插入一条记录。

INSERT INTO T_TARIF (
    CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT
) 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90'

它返回一个错误(违反主键),这没有任何意义,因为MODE_LIV = 2 不等于MODE_LIV = 4

我知道我可以添加代理键作为自动递增的标识列,但在我的情况下,这不是一个选项。

【问题讨论】:

  • 您正在为所有 PK 列插入 3 行具有相同值的行。 (实际上是所有非 PK 列)

标签: sql primary-key


【解决方案1】:

您要在主键字段中插入 3 行具有相同数据的行。
当然你会得到PK违规。

将代码改为:

INSERT INTO T_TARIF (CODE_TARIF, ZONE, UNITE, MODE_LIV, LIBELLE, TR_DEBUT, TR_FIN, MONTANT) 
SELECT 'Livr_A_50_99', '2', '1', '3', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '4', 'sdg', '50', '99', '90' 
UNION ALL 
SELECT 'Livr_A_50_99', '2', '1', '5', 'sdg', '50', '99', '90'

//Different data for every row    ^

【讨论】:

    【解决方案2】:

    查看您的查询,我看到您尝试在具有主键的表中插入三个完全相等的记录(这是违反的,因为构建 PK 的三个字段相同 'Livr_A_50_99', '1', '4')!!

    【讨论】:

      【解决方案3】:

      我猜“三个主键”是指复合键。你的情况,你的主键不能有重复数据,CODE_TARIFUNITEMODE_LIV的组成是三个重复记录。

      【讨论】:

        【解决方案4】:

        如果我没看错你的帖子,你有一个由(CODE_TARIF、UNITE 和 MODE_LIV)组成的复合 PK

        在这种情况下,您的插入尝试使用 PK 插入所有 3 行

        'Livr_A_50_99','1', '4'
        

        如果您不打算插入完全相同的数据 3 次,请将您的 UNION ALL 替换为 UNION,这将只插入该行一次。

        如果您打算使用代理自动递增 PK,则需要将表 DDL 更改为

        CREATE TABLE T_TARIF
        (
            T_TARIF_Id INT identity(1,1) NOT NULL,
        ... Other fields here
        
        )
        GO
        
        ALTER TABLE T_TARIF ADD CONSTRAINT PK_Tariff PRIMARY KEY(T_TARIF_Id)
        GO
        

        【讨论】:

          【解决方案5】:

          主键用于标识单行数据。

          在您的示例中,您插入了 3 行相同的数据。这意味着主键将标识所有三行,而不仅仅是一个。根据定义,这是违反主键的。

          您的选择是:
          - 添加一个新字段(例如自动递增 id)以区分行
          - 仅插入重复行之一
          - 修改您的数据,使其只需要插入一次(例如添加“计数”字段)
          - 修改您的数据,使 PK 字段与任何其他行都不相同

          【讨论】:

            猜你喜欢
            • 2021-04-11
            • 2016-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-06
            • 2012-07-15
            相关资源
            最近更新 更多