2010-04-08 14 views
11
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) 
); 

È possibile che questo ddl genera un errore:Come aumentare automaticamente la chiave non primaria? - SQL Server

Msg 2744, Level 16, State 2, Line 1 Multiple identity columns specified for table 'SupplierQuote'. Only one identity column per table is allowed.

come posso risolverlo? Voglio che PONumber sia auto-incrementato.

risposta

7

Non è possibile avere più di una colonna Identity per tabella. Penso che la soluzione migliore sarebbe quella di tirare i dati PO in una tabella separata, quindi collegare i due con una colonna FK.

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

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

Il problema si verifica quando il record fornitoreQuoteID viene eliminato, l'acquistoOrder nella tabella padre sarà inutile. Quindi, dovrò scrivere un trigger o così per cancellare il record genitore purchaseOrder. Ho deciso di inserire PONumber manualmente dal front-end utilizzando un generatore casuale o giù di lì. – user311509

+0

Non vorrei usare un generatore di numeri casuali se si vuole essere sicuri che i PONUMER siano unici. Vorrei utilizzare Guid.NewGuid(). I due modi più semplici per garantire l'unicità in un database sono l'uso dell'identità o un GUID. –

+0

È inoltre possibile eliminare in cascata le eliminazioni: quando si elimina un fornitore, è possibile impostare l'eliminazione in cascata sul record PurchaseOrder associato, a condizione che non sia associato a nessun altro SupplierQuote. –

2

Non è possibile risolvere l'utente: è possibile disporre di una singola colonna IDENTITY per tabella. Assolutamente no, mi dispiace.

L'unica soluzione "hackish" sarebbe quella di avere una tabella separata per nient'altro che avere un campo INT IDENTITY e afferrare il valore più nuovo da quella tabella helper nella propria entità al momento dell'inserimento (ad esempio con un trigger). Non molto carina, ma potrebbe funzionare per te.

9

Se SupplierQuoteId e PONumber vengono generati quando viene inserita una riga, poi le due colonne "identità" verrebbero assegnati in sincronia (3504 va con 9553, 3506 va con 9573, 3508 va con 9593, etc.) . Se questa ipotesi è vera, allora si potrebbe fare presumibilmente PONumber una colonna calcolata, in questo modo:

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

ho fatto supplierQuoteId NOT NULL, che assicura che PONumber sarà anche NOT NULL. Allo stesso modo, non è più necessario il vincolo univoco su PONumber, in quanto sarà sempre univoco. (È possibile creare indici su colonne calcolate, se ne hai bisogno per le prestazioni.)

0

Penso che utilizzerei un trigger per riempire la "seconda identità".

1

Se esiste un solo ID PO per offerta fornitore, perché non utilizzare semplicemente l'ID offerta fornitore come ID ordine di acquisto?

Se ce ne possono essere più di uno, è necessario disporre di una tabella separata con un vincolo di chiave esterna. Ovviamente puoi usare cascade delete per cancellare da questa tabella ma questo può essere pericoloso se elimini troppi record (causando blocchi) o personalmente non vorrei cancellare una citazione fornitore se è stato creato un numero PO poichè ciò significa l'articolo quotato è stato effettivamente acquistato. Non vuoi mai distruggere record di cose che sono state effettivamente acquistate. Dal momento che probabilmente avrai più POS (ho ricevuto un preventivo su sei cose e ne ho acquistati tre, poi ne ho comprati altri due la settimana successiva) per preventivo e dato che è probabile che tu voglia memorizzare informazioni specifiche sull'ordine d'acquisto, io raccomandare una tabella separata. Fare qualsiasi altra cosa ti causerà problemi a lungo termine.

0

Incremento automatico del percento nella colonna non identificata. (MS SQL) Non penso che questa sia la migliore pratica però! JUst una soluzione rapida.

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()) 
Problemi correlati