Как автоматически увеличить дополнительный ключ? - SQL Server

CREATE TABLE SupplierQuote
(
supplierQuoteID int identity (3504,2) CONSTRAINT supquoteid_pk PRIMARY KEY,
PONumber int identity (9553,20) NOT NULL
.
.
.
CONSTRAINT ponumber_uq UNIQUE(PONumber)
);

Вышеупомянутый ddl создает ошибку:

Msg 2744, уровень 16, состояние 2, строка 1 Указано несколько столбцов идентификации для таблицы 'SupplierQuote'. Единственный столбец с идентификатором для таблицы.

Как я могу это решить? Я хочу, чтобы PONumber автоматически увеличивался.

Ответ 1

У вас не может быть более одного столбца для каждой таблицы. Я думаю, что лучше всего было бы потянуть данные ПО в отдельную таблицу, а затем связать их с колонкой FK.

SupplierQuote
-------------
supplierQuoteID (PK/identity)
purchaseOrderID (FK to PurchaseOrder.purchaseOrderID)
otherColumn1

PurchaseOrder
-------------
purchaseOrderID (PK/identity)
otherColumn1

Ответ 2

Если SupplierQuoteId и PONumber генерируются при вставке строки, тогда два столбца "identity" будут назначены в блокировке (3504 идет с 9553, 3506 идет с 9573, 3508 - с 9593 и т.д.). Если это предположение верно, то вы предположительно могли бы сделать PONumber рассчитанным столбцом, например:

CREATE TABLE SupplierQuote 
( 
supplierQuoteID int NOT NULL identity (3504,2) CONSTRAINT supquoteid_pk PRIMARY KEY, 
PONumber AS (10 * supplierQuoteID - 25487)
. 
. 
. 
); 

Я сделал поставщикQuoteId NOT NULL, который гарантирует, что PONumber также будет NOT NULL. Точно так же вам больше не понадобится уникальное ограничение на PONumber, так как оно всегда будет уникальным. (Можно построить индексы для вычисленных столбцов, если вам нужна эта функция.)

Ответ 3

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

Единственное "хакерское" решение состоит в том, чтобы иметь отдельную таблицу, не превышающую поля INT IDENTITY, и захватывать новейшее значение из этой вспомогательной таблицы в ваш объект при вставке (например, с помощью триггера). Не очень красиво, но это может сработать для вас.

Ответ 4

Если есть только один идентификатор PO для каждой цитаты поставщика, то почему бы просто не использовать идентификатор цитаты поставщика как идентификатор PO?

Если их может быть больше одного, у вас должна быть таблица sepapate с ограничением внешнего ключа. Конечно, вы можете использовать удаление каскада для удаления из этой таблицы, но это может быть опасно, если вы удаляете слишком много записей (вызывающих блокировки) или лично я не хочу удалять цитату поставщика, если номер PO был создан, поскольку это означает, что купленный товар фактически куплен. Вы не хотите когда-либо уничтожать записи вещей, которые были фактически куплены. Поскольку у вас, вероятно, будет несколько POS (я получил цитату по шести предметам и сначала купил три из них, а затем купил две другие на следующей неделе) за каждую цитату, и, поскольку вы, вероятно, захотите сохранить конкретную информацию о заказе на поставку, я рекомендуем отдельную таблицу. Чтобы сделать что-либо еще, вы создадите проблемы в конечном итоге.

Ответ 5

Я думаю, что я бы использовал триггер, чтобы заполнить "второе удостоверение".

Ответ 6

Ограничить автоматическое увеличение в столбце не идентичности. (MS SQL) Я не думаю, что это лучшая практика! JUst быстрое решение.

    INSERT INTO [dbo].[Employee]
           ([EmpID]
           ,[Name]
           ,[Salary]
           ,[Address]
           ,[datecoded])
     VALUES
           ( (select top 1 EmpID from dbo.Employee order by EmpID desc) + 1
           , 'name_value'
           , 123456
           ,'address_value'
           , GETDATE())