Как автоматически увеличить не первичный ключ? - SQL Server - PullRequest
13 голосов
/ 08 апреля 2010
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 выдает ошибку:

Сообщение 2744, Уровень 16, Состояние 2, Строка 1 Указано несколько столбцов идентификаторов для стола 'SupplierQuote'. Только один допускается использование столбца идентификаторов для таблицы.

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

Ответы [ 6 ]

9 голосов
/ 08 апреля 2010

Если SupplierQuoteId и PONumber генерируются при вставке строки, тогда два столбца «идентификатора» будут назначены на шаге (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)
. 
. 
. 
); 

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

7 голосов
/ 08 апреля 2010

В одной таблице не может быть более одного столбца идентификаторов. Я думаю, что лучше всего было бы вытащить данные PO в отдельную таблицу, а затем связать их с колонкой FK.

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

PurchaseOrder
-------------
purchaseOrderID (PK/identity)
otherColumn1
2 голосов
/ 08 апреля 2010

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

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

1 голос
/ 08 апреля 2010

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

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

0 голосов
/ 01 августа 2015

Автоматический прирост в столбце без идентификатора. (MS SQL) Я не думаю, что это лучший способ! Просто быстрое решение проблемы.

    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())
0 голосов
/ 08 апреля 2010

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

...