2011-06-12 7 views
5

Ho 3 tabelle. Una tabella di base, chiamiamola Tabella A e due tabelle che fanno riferimento alla Tabella A, chiamale Tabella X e Tabella Y. Sia X che Y hanno una contraint chiave esterna che fa riferimento alla Tabella A. Anche la Chiave esterna di X e Y è la loro propria Chiave primaria.Un vincolo che consente solo a una delle due tabelle di fare riferimento a una tabella di base

Mi piacerebbe sapere se è possibile aggiungere un vincolo che consentirà solo a una di queste tabelle di contenere un recrod che fa riferimento alla Tabella A. Quindi se X ha un record che fa riferimento a A allora Y non può avere uno e se Y ha un record che fa riferimento a A, allora X non può averne uno.

È possibile?

Grazie,

+0

Sarei curioso del tuo caso d'uso. C'è qualcosa di interessante sulla tua struttura. Hai 3 chiavi primarie usando lo stesso valore chiave. – NullRef

+0

Sì, sono tre tabelle per la memorizzazione degli account utente. Esistono due tipi di account. Quindi esiste una tabella di base che contiene informazioni comuni a entrambi i tipi di account e quindi una tabella per ogni tipo di account che contiene informazioni specifiche per quel tipo di account. Quindi il PK per ogni tabella è l'ID utente perché ho pensato che questo avrebbe reso le cose coerenti e rendere facile l'accesso a un record tramite UserID. –

risposta

7

I vincoli CHECK con le UDF (che è la risposta di Oded) non si adattano bene e hanno scarsa concorrenza. Vedere questi:

Quindi:

  • creare una nuova tabella, dire TableA2XY
  • questo ha la PK di TableA e un char (1) colonna con un CONTROLLO per consentire solo X o Y. E anche un vincolo univoco sul PK di A.
  • TableX e Tabley hanno nuova colonna char (1) con un controllo per consentire rispettivamente solo X o Y
  • TableX e Tabley hanno la loro FK TableA2XY su entrambe le colonne

Questo è l'approccio superchiave o sottotipo

  • tutti DRI basato
  • non innesca
  • non UDF con l'accesso tavolo vincoli CHECK.
+0

Sto facendo praticamente la stessa cosa di quello che hai descritto. Recentemente sono passato ad aggiungere una colonna CHAR (1) calcolata persistente nella mia tabella figlia, in modo che non venga visualizzata negli elenchi di colonne generati automaticamente da SQL Prompt –

1

Sì, questo è possibile utilizzando CHECK constraints.

Oltre al normale vincolo di chiave esterna, è necessario aggiungere uno CHECK constraint in entrambe le tabelle di riferimento per garantire che non venga utilizzata una chiave esterna nell'altra tabella di riferimento.

+0

Il CHECK ha bisogno di un udf scalare che non sia sicuro e lento. Vedi la mia risposta per favore. – gbn

Problemi correlati