7

Tabella A ha un campo calcolato denominato Computed1. È persisted e non è nullo. Inoltre, calcola sempre un'espressione che è char (50). È anche unico e ha un vincolo chiave unico su di esso.Come inserire vincoli di chiave esterna su un campo calcolato in SQL Server?

La tabella B ha un campo RefersToComputed1, che deve fare riferimento a un valore Computed1 valido.

cercando di creare un vincolo di chiave esterna di B RefersToComputed1 che fa riferimento a un' Computed1 porta alla seguente errore:

Error SQL01268: .Net SqlClient Data Provider: Msg 1753, Level 16, State 0, Line 1 Column 
'B.RefersToComputed1' is not the same length or scale as referencing column 'A.Computed1' in 
foreign key 'FK_B_A'. Columns participating in a foreign key relationship must be defined with 
the same length and scale. 

D: Perché questo errore creato? Ci sono misure speciali necessarie per le chiavi esterne per le colonne calcolate e, in caso affermativo, quali sono?


Sommario:

  • Il problema specifico sale dal computerizzata, char base, essendo campi varchar. Quindi, Computed1 è varchar (50) e non char (50).
  • È preferibile disporre di un cast che circonda un'espressione di campo calcolato per forzarlo su un tipo specifico. Il merito va a Cade Roux per questo suggerimento.

risposta

6

Il campo calcolato è composto da char (M), char (N) e così via, che si sommano a M + N + .. = 50, ma il campo calcolato stesso è varchar (50). La modifica di RefersToComputed1 su varchar (50) anziché char (50) risolve il problema.

Le chiavi esterne dei campi calcolati non richiedono alcun trattamento speciale (anche se potrebbe essere richiesto persistente nella colonna calcolata).

+0

buono catch - CHAR (50) sarà riempito a 50 caratteri di lunghezza con spazi, mentre VARCHAR non lo sarà - un altro vantaggio per l'utilizzo di VARCHAR su CHAR per questo genere di cose! –

+2

Persistato avrebbe dovuto indicizzarlo, che sarebbe necessario per creare un FK su di esso ... – gbn

+0

Puoi anche fare un cast nell'espressione della colonna computata per assicurarti che la colonna persistente sia del tipo che pensi sia. Questo è un grosso problema nelle operazioni con le stringhe. –

1

È RefersToComputed1 una chiave primaria di tipo char(50)?

+0

@Lucero: Non è una chiave primaria. La relazione è molti a uno, quindi nella tabella B possono esserci più RefersToComputed1 dello stesso valore. –

+0

Quindi, cosa stai cercando di fare esattamente? viene usato un vincolo di chiave esterna per assicurarsi che una colonna abbia solo voci da una chiave primaria referenziata, ma nel tuo caso non esiste una chiave primaria. Spiega per favore. – Lucero

+2

è possibile * anche * fare riferimento a un indice univoco con una chiave esterna - non deve essere necessariamente PK. –

1

È RefersToComputed1 esattamente lo stesso tipo di dati, lunghezza e confronto esattamente come Computed1?

Doppio controllo ... ad esempio, è necessario un CAST finale o un COLLATE su Computed1 per assicurarsi che sia quello che ti aspetti? Dico questo perché l'errore sta dicendo che le 2 colonne sono diverse

Edit: char e varchar non sono tipi di dati identici, quindi avrete bisogno di un CAST per cambiarlo

Problemi correlati