Как я нарушаю это ограничение? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть это ограничение в таблице:

CREATE TABLE [dbo].[InventoryLocations]
(
    [recid] [int] IDENTITY(1,1) NOT NULL,
    [LocItemNumber] [char](16) NOT NULL,
    [WareHouse] [char](2) NOT NULL,
    [Aisle] [char](3) NOT NULL,
    [Slot] [char](3) NOT NULL,
    [locLevel] [char](2) NOT NULL,
    [Bin] [char](2) NOT NULL,
    [Extra] [char](2) NOT NULL,
    [LocNumber] [char](2) NOT NULL,
    [RollNumber] [char](20) NOT NULL,
    [QuickRoll] [int] NOT NULL,
    [SkidNumber] [char](15) NOT NULL,
    [RollsInStock] [int] NOT NULL,
    [LocQtyOnHand] [float] NOT NULL,
    [LocQtyOnOrder] [float] NOT NULL,
    [LocQtyCommited] [float] NOT NULL,
    [TotalReceived] [float] NOT NULL,
    [TotalIssued] [float] NOT NULL,
    [TotalDollars] [float] NOT NULL,
    [Capacity] [float] NOT NULL,
    [AvailableSpace] [float] NOT NULL,
    [bkey0] [char](30) NULL,
    [bkey1] [char](30) NULL,
    [bkey2] [char](30) NULL,
    [bkey3] [char](14) NULL,
    [LastPhysicalCountDate] [datetime] NULL,
    [LastCycleCountDate] [datetime] NULL,
    [EnteredBy] [varchar](50) NULL,
    [EnteredDateTime] [datetime] NULL,
CONSTRAINT [IX_InventoryLocations_1] UNIQUE NONCLUSTERED 
(
    [LocItemNumber] ASC,
    [WareHouse] ASC,
    [Aisle] ASC,
    [Slot] ASC,
    [locLevel] ASC,
    [Bin] ASC,
    [Extra] ASC,
    [RollNumber] ASC,
    [SkidNumber] ASC
));

И при попытке вставить следующие строки я получаю сообщение об ошибке.Внутри курсора, который заполняет переменные.

INSERT INTO [AVANTISERVER\NCL_MASTER].[Avanti].[dbo].[InventoryLocations](LocItemNumber, WareHouse, Aisle, Slot, locLevel, Bin, Extra, RollNumber, LocQtyOnHand, SkidNumber)
            SELECT @item, 'F', 'L', 'E', 'X', 'O', @seq, @seq, @qty, @seq
            FROM FI_CurrentReceiptData CR

, который работает для:

VALUES('MW1', 'F', 'L', 'E', 'X', 'O', 0, 0, 10, 0)
VALUES('MW1', 'F', 'L', 'E', 'X', 'O', 1, 1, 10, 1)

Сообщение 2627, Уровень 14, Состояние 2, Строка 34 Нарушение ограничения UNIQUE KEY'IX_InventoryLocations_1.Невозможно вставить дубликат ключа в объект 'InventoryLocations'.

Пожалуйста, помогите мне понять, почему я не могу сделать эти вставки?У меня нет опыта такого рода сложных ограничений.Что это значит (простыми словами) и как я могу обойти это?На самом ли деле я нарушаю ограничение?

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

у вас уже есть строки в таблице, которые конфликтуют с данными из вашего вопроса, которые вы пытаетесь вставить?

РЕДАКТИРОВАТЬ после комментариев и редактирования вопроса
добавить это:

поместите несколько отпечатков в ваш цикл, чтобы увидеть, какие значения вы вставляете. Я не думаю, что SQL Server выдаст ошибку, если вы не пытаетесь вставить дупс.

1 голос
/ 07 сентября 2011

Все элементы в вашем списке SELECT являются константными выражениями.

INSERT INTO [AVANTISERVER\NCL_MASTER].[Avanti].[dbo].[InventoryLocations](LocItemNumber, WareHouse, Aisle, Slot, locLevel, Bin, Extra, RollNumber, LocQtyOnHand, SkidNumber)
            SELECT @item, 'F', 'L', 'E', 'X', 'O', @seq, @seq, @qty, @seq
            FROM FI_CurrentReceiptData CR

Я не уверен, почему вы ожидаете, что он будет отличаться между строками, но в любом случае это не будет.Возможно, вы имели в виду ссылку на столбец, а не на переменную где-то.

Как вы говорите в комментариях, эти переменные обновляются курсором, вероятно, ваш SELECT возвращает несколько строк FROM FI_CurrentReceiptData.Закомментируйте вставку, посмотрите на результаты и посмотрите, сколько строк возвращено.Или просто удалите FROM FI_CurrentReceiptData CR полностью, поскольку SELECT ничего не использует из него.

0 голосов
/ 07 сентября 2011

Вы должны сообщить нам первую часть INSERT, а не только значения. Однако легко сказать, что в основном вы пытаетесь вставить запись, которая будет нарушать [IX_InventoryLocations_1], в которой говорится, что никакие 2 записи в таблице не могут иметь одинаковые значения для следующих полей:

[LocItemNumber]
[WareHouse]
[Aisle]
[Slot]
[locLevel]
[Bin]
[Extra]
[RollNumber]
[SkidNumber]
0 голосов
/ 07 сентября 2011

Не зная имен столбцов, которые вы пытаетесь INSERT, просто числом столбцов, перечисленных в вашем ограничении (9), похоже, что каждая строка должна быть полностью уникальный в таблице InventoryLocations.Вы вставляете (10) столбцов.Ваше ограничение определено неверно на основе данных, которые вы хотите добавить.

EDIT : после редактирования определения таблицы в списке UNIQUE CONSTRAINT по-прежнему остается слишком много столбцов, что вызываетINSERT ошибка.Было бы очень полезно, если бы вы перечислили имена столбцов, в которые вы вставляете.

EDIT : вы вставляете жестко закодированные значения в столбцы, перечисленные в вашем ограничении.Поскольку они всегда будут одинаковыми, ограничение нарушается, и вы видите опубликованную ошибку.Вам нужно либо изменить данные, поступающие в таблицу, либо ослабить ограничение, удалив некоторые столбцы.

...