2011-09-07 2 views
1

У меня есть это ограничение в таблице:Как я нарушаю это ограничение?

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) 

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

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

+0

Можете ли вы показать схему для таблицы, или она точно такая же, как показано в определении ограничения? Можете ли вы также показать точный оператор 'INSERT' (или вообще не включать имена столбцов)? Обратите внимание, что нарушение ограничений может не возникать из-за столкновения в двух строках, которые вы вставляете, но одна или обе комбинации клавиш могут уже существовать в таблице. –

+0

Является ли LocItemNumber основным ключом для таблицы? –

+0

Предложение 'values' теперь не имеет никакого отношения к вашей структуре таблицы. Каков фактический код, который терпит неудачу? –

ответ

1

Все элементы в вашем списке 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

Оператор insert находится внутри курсора (как указано в моих праведниках). – MAW74656

+0

Вероятно, ваш 'SELECT' возвращает несколько строк' FROM FI_CurrentReceiptData'. Прокомментируйте вставку и посмотрите результаты. –

+0

... или один или несколько из комбинации клавиш уже представлены в таблице. Я думаю, что OP фокусируется на данных, выходящих за пределы курсора, но не сравнивая их с данными, которые уже находятся в таблице. –

0

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

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

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

+0

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

-1

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

[LocItemNumber] 
[WareHouse] 
[Aisle] 
[Slot] 
[locLevel] 
[Bin] 
[Extra] 
[RollNumber] 
[SkidNumber] 
+0

7-й и 8-й тоже разные. –

+0

Это неправда, 7-й и 8-й тоже разные. И я предполагаю, что первый столбец в инструкции insert фактически не определен в ограничении. –

+0

Оригинальная версия также показала 7-е и 8-е поля. – JNK

3

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

EDIT после комментариев и вопросов редактировать
добавить следующее:

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

+0

@KM -Нет, в таблице не указано «MW1» locItemNumber вставляет – MAW74656

+2

ваше редактирование по вопросу показывает, что в таблице есть много столбцов, но вы предоставляете только половину вставки, где находится список столбцов? –

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