2012-05-08 5 views
8

ho creato la tabella t1t2 che collega tabelle t1 e t2 come segue:Combinazione di due colonne vincolo univoco

CREATE TABLE t1t2(
id integer primary key, 
t1_id integer, 
t2_id integer, 
foreign key(t1_id) references t1(id), 
foreign key(t2_id) references t2(id)); 

È possibile definire un vincolo (restrizione) che consente uno solo valori di tupla (t1_id, t2_id)? O dovrei controllare questo nell'applicazione?

risposta

14
CREATE UNIQUE INDEX idx_twocols ON t1t2(t1_id, t2_id) 

Si avrà probabilmente bisogno di aggiungere NOT NULL alle dichiarazioni per ciascuna delle due colonne.

In alternativa, si può scegliere di rinunciare alla colonna della chiave primaria (se tutto quello che si usa per è l'unicità) e creare la chiave primaria sulla combinazione di t1_id e t2_id:

CREATE TABLE t1t2(
t1_id integer NOT NULL, 
t2_id integer NOT NULL, 
PRIMARY KEY (t1_id, t2_id), 
foreign key(t1_id) references t1(id), 
foreign key(t2_id) references t2(id)); 

la chiave primaria è un caso speciale di un indice UNIQUE. L'utilizzo del PRIMARY KEY composito consente di risparmiare una colonna e un indice, ma richiede all'applicazione di conoscere sia t1_id sia t2_id per recuperare una singola riga dalla tabella.

+0

E 'non solo per l'unicità (ho bisogno di colonna t1t2.id), ma mi interessa nel metodo alternativo. Potresti mostrare il tavolo? Aspetterò un po 'di tempo prima di accettare di avere la certezza che sia corretto, grazie. – xralf

+1

Vedere la risposta modificata. –

6

È possibile aggiungere un vincolo univoco all'istruzione della tabella create. Questa non deve essere la chiave primaria.

UNIQUE(t1_id, t2_id), 
0

Si potrebbe creare il tuo indice primario unico con queste opzioni per mantenere la chiave primaria e un vincolo univoco SQL Lite New Index option

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – mathielo