2015-12-10 2 views
0

У меня есть таблица с первичным ключом, состоящей из 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 года, и я бегу в пр ocedure, я получаю эту ошибку:

Violation of PRIMARY KEY constraint 'PK__INV_STOC__3B64B7082B9540B9'. Cannot insert duplicate key in object 'dbo.INV_STOCK_TEST'. The duplicate key value is (A, A, ITEM_A, 2017).

Я не могу изменить первичный ключ, как это исправить?

+0

Первичные ключи не могут иметь повторяющиеся данные. вам может потребоваться перепроектировать таблицу, если вы хотите, чтобы эти значения были вставлены. Используйте этот код, чтобы удалить первичный ключ «ALTER TABLE INV_STOCK_TEST DROP CONSTRAINT PK__INV_STOC__3B64B7082B9540B9» – Dalton

+0

Мне нужно сохранить данные не дублирующимися, я вставляю данные с тремя одинаковыми первичными данными и 1 первичными данными различны (YEAR) – Mike

ответ

0

Имейте поле идентификатора, которое связано с записью, и используйте это как первичный ключ, вместо того, чтобы пытаться создавать несколько неповторимых идентифицирующих полей.

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 
) 

процедура должна работать точно так же.

+0

да, он должен работать, но он не работает не допускать дублирования одного и того же элемента с тем же именем, то же самое, в том же году, и это становится проблемой – Mike

Смежные вопросы