【问题标题】:Violation of Primary Key constraint when Inserting插入时违反主键约束
【发布时间】:2015-12-10 04:55:18
【问题描述】:

我有一个表,其主键由 4 列组成,如下所示:

CREATE TABLE [dbo].[INV_STOCK_TEST]
(
    [STOCK_WRH_ID]  [varchar](6) NOT NULL,
    [STOCK_LOC_ID]  [varchar](6) NOT NULL,
    [STOCK_ITEM_NO] [varchar](20) NOT NULL,
    [STOCK_BEG_QTY] [decimal](9, 2) NULL,
    [YEAR]          [nvarchar](5) NOT NULL, 

    CONSTRAINT [PK__INV_STOC__3B64B7082B9540B9]
    PRIMARY KEY CLUSTERED  (
        [STOCK_WRH_ID] ASC,
        [STOCK_LOC_ID] ASC,
        [STOCK_ITEM_NO] ASC,
        [YEAR] ASC
    )WITH (
        PAD_INDEX = OFF,
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF,
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON
    ) ON [PRIMARY]
) ON [PRIMARY]

我有一个程序来更新这个表中的年度数据

DECLARE @YEAR nvarchar(20)

SET @YEAR = (SELECT TOP 1 [YEAR] FROM INV_STOCK_TEST ORDER BY [YEAR] DESC)

INSERT INTO INV_STOCK_TEST([STOCK_WRH_ID], [YEAR],
                           [STOCK_LOC_ID], [STOCK_BEG_QTY], [STOCK_ITEM_NO])
    SELECT
        STOCK_WRH_ID, @YEAR + 1,
        STOCK_LOC_ID, 0, STOCK_ITEM_NO
    FROM
        INV_STOCK_TEST

插入数据示例

A   A   ITEM_A  0.00    2014
A   A   ITEM_A  0.00    2015
B   B   ITEM_B  0.00    2014
B   B   ITEM_B  0.00    2015

2014 年到 2015 年没关系,但是当 2015 年到 2016 年运行程序时,我收到此错误:

违反主键约束“PK__INV_STOC__3B64B7082B9540B9”。 无法在对象“dbo.INV_STOCK_TEST”中插入重复键。这 重复键值为 (A, A, ITEM_A, 2017)。

我无法更改主键,如何解决这个问题?

【问题讨论】:

  • 主键不能有重复数据。如果你想插入这样的值,你可能需要重新设计表格。使用此代码删除主键“ALTER TABLE INV_STOCK_TEST DROP CONSTRAINT PK__INV_STOC__3B64B7082B9540B9”
  • 我需要保持数据不重复,我插入了 3 个相同的主数据和 1 个不同的主数据(年份)

标签: sql-server stored-procedures


【解决方案1】:

拥有一个与记录相关的 ID 字段并将其用作主键,而不是尝试创建多个非唯一标识字段。

CREATE TABLE [dbo].[INV_STOCK_TEST]
(
[PK_ID]         [INT] PRIMARY KEY CLUSTERED,
[STOCK_WRH_ID]  [varchar](6) NOT NULL,
[STOCK_LOC_ID]  [varchar](6) NOT NULL,
[STOCK_ITEM_NO] [varchar](20) NOT NULL,
[STOCK_BEG_QTY] [int] NULL, -- decimals lack precision
                            -- use integers when dealing with discrete.
[YEAR]          [varchar](5) NOT NULL --I would use a datetime here
                                      --purely for formatting reasons
)

该过程应该完全相同。

【讨论】:

  • 是的,它应该可以工作,但它不能防止重复相同的项目相同的 wrh ,相同的位置,相同的年份,这已经成为问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2022-01-06
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多