Non è possibile che la chiave esterna (singola colonna) in una tabella figlio faccia riferimento a una chiave genitore che ha alcuni valori duplicati?la chiave esterna fa sempre riferimento a una chiave univoca in un'altra tabella?
risposta
Secondo lo standard SQL, una chiave esterna deve fare riferimento sia alla chiave primaria che a una chiave univoca della tabella padre. Se la chiave primaria ha più colonne, la chiave esterna deve avere lo stesso numero e ordine di colonne. Pertanto la chiave esterna fa riferimento a una riga univoca nella tabella padre; non ci possono essere duplicati
Re tuo commento:
Se T.A
è una chiave primaria, allora no, non può avere duplicati. Qualsiasi chiave primaria deve essere univoca e non nulla. Pertanto, se la tabella figlio ha una chiave esterna che fa riferimento alla chiave primaria del genitore, deve corrispondere a un valore univoco non nullo e quindi fa riferimento esattamente a una riga nella tabella padre. In questo caso non è possibile creare una riga figlio che faccia riferimento a più righe padre.
È possibile creare una riga figlio la cui colonna chiave esterna è NULL, nel qual caso non fa riferimento a nessuna riga nella tabella padre.
No, non è possibile.
Quando si definisce un vincolo di chiave esterna su una tabella, significa che c'è una sola chiave corrispondente nella tabella esterna. Se sul tavolo estero esistessero multipli che si dovrebbero intendere?
Wikipedia ha questa definizione sul Foreign key ingresso:
Una chiave esterna è un campo in una tabella relazionale che corrisponde a una chiave candidata di un'altra tabella
chiavi candidate sono unici all'interno di una tabella .
Grazie per l'aiuto .. – ratsy
Sì, è possibile che una chiave esterna faccia riferimento a una colonna con valori duplicati.
Ciò può accadere se la chiave primaria utilizza un indice non univoco e non viene convalidata quando viene creata. (Ma non ho mai visto una situazione del genere nella vita reale. Come @ Bill Karwin sottolineato, sarebbe molto confuso. Quindi questo non può essere una situazione che ha realmente bisogno di preoccuparsi.)
--Create a table with two duplicate rows
create table test1(a number);
insert into test1 values(1);
insert into test1 values(1);
commit;
--Create a non-unique index
create index test1_index on test1(a);
--Use the non-unique index for the primary key, do not validate
alter table test1 add constraint test1_pk primary key (a)
using index test1_index novalidate;
--Build another table with a foreign key to TABLE1
create table test2(a number,
constraint test2_fk foreign key (a) references test1(a));
--Inserting a value that refers to the duplicate value still works.
insert into test2 values(1);
commit;
--The foreign key still works:
--ORA-02291: integrity constraint (TEST2_FK) violated - parent key not found
insert into test2 values(2);
--The primary key works as expected, but only for new values:
--ORA-00001: unique constraint (TEST1_PK) violated
insert into test1 values(1);
Wacky. Penso che questo cade sotto la categoria di "perché lo faresti?" :-) Ma grazie per il chiaro esempio! –
Grazie Jonearles per l'esempio precedente! .... stessa situazione nel database che sto usando, ma perché e come ..? – ratsy
Esistono diversi buoni motivi per utilizzare un indice non univoco per una chiave primaria; vincoli deferrabili, più opzioni per la ricostruzione (in particolare il parallelismo), l'indice esisteva prima del vincolo, ecc. Cerca qui per gli indici univoci e non univoci: http://richardfoote.wordpress.com/2008/06/04/primary -keys-and-non-unique-indexes-whats-really-happening/ Il NOVALIDATE è un po 'strano. Per quanto ne so, non ci sono vantaggi nell'utilizzarlo, a meno che non sia necessario avere alcuni dati "cattivi". Questi casi dovrebbero davvero essere documentati. Se non è documentato, forse è stato solo un errore? –
Grazie, ma se parliamo di una chiave esterna a colonna singola come la colonna 'a' è la chiave foriegn nella tabella figlio t che fa riferimento alla colonna 'A' nella tabella padre T, quindi ora non è possibile in nessuna situazione che la colonna A possa avere qualsiasi valori duplicati nella tabella T? vuol dire che gli allarmi di una chiave straniera si riferiscono a una chiave primaria in un'altra tabella ?? – ratsy
@ratsy: una chiave esterna deve sempre fare riferimento a una colonna o colonne dichiarate come PRIMARY KEY o UNIQUE. (A meno che tu non stia usando MySQL, ma dovresti comunque scegliere come target solo le colonne PRIMARY KEY o UNIQUE anche in MySQL. Cerca http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints. html per "il sistema non impone il requisito che le colonne di riferimento siano UNICHE".) –
@Catcall: true, ma @ratsy ha taggato questa domanda 'oracle' quindi non ho richiamato il comportamento non standard di InnoDB. Anche quando si utilizza InnoDB, mi raccomando fortemente contro il riferimento a righe padre non univoche, perché è facile confondersi in questo modo. –