Oracle
 sql >> Database >  >> RDS >> Oracle

come inserire una chiave esterna in una tabella

Non sono del tutto sicuro di cosa intendi per "immissione di un ID errato", ma presumo che tu intenda un ID che non è valido, piuttosto che un semplice errore (come dire che qualcuno si trova in una città diversa da quella in cui si trova davvero sono).

Il vincolo di chiave esterna significa che il valore che inseriscono nella person tabella per city_id ha esistere come chiave primaria nella city tavolo. Non possono inserire alcun vecchio valore come city_id , solo valori validi. E la corrispondente city la riga non può quindi essere eliminata senza rimuovere/modificare il riferimento nella person tabella (ad es. l'aggiornamento a un valore valido diverso) o - improbabile in questo caso - l'eliminazione a cascata in modo che qualsiasi person record per la city vengono cancellati.

Quindi diciamo che crei le tue tabelle come:

create table city (id number primary key, code varchar2(2), name varchar2(30));

create table person (id number, name varchar2(30), last_name varchar2(30),
    city_id number not null references city(id));

Hai tre record nella tua city tabella:

insert into city (id, name) values (1, 'New York');
insert into city (id, name) values (2, 'London');
insert into city (id, name) values (3, 'Paris');

Quindi puoi aggiungere una person che vive a New York includendo l'ID di quella città:

insert into person (id, name, last_name, city_id)
values (1, 'Michael', 'Bloomberg', 1);

(SQL Fiddle )

Non stai denormalizzando i dati nella city corrispondente record, quindi se New York decidesse di cambiare il suo nome in New Amsterdam, diciamo, si tratterebbe di un unico aggiornamento per la city record e non dovresti toccare nessuna person record per le persone in quella città.

Se hai provato a eliminare la city record per New York, riceveresti un errore (ORA-02292) che dice che esisteva un record figlio. Puoi aggiornare la person record per avere un city_id di 2 o 3 e sarebbe quindi in grado di eliminare New York. L'idea è che non puoi farlo per caso e lasciare dati orfani dietro:un person_id che punta a una city che non esiste più.

Se hai provato a creare una person registra con un city_id valore che non corrisponde a un city.id valore:

insert into person (id, name, last_name, city_id)
values (2, 'Elvis', 'Presley', 4);

... quindi otterresti un errore (ORA-02291) che la chiave genitore, ovvero un id corrispondente valore nella city tabelle - non esiste.

Puoi leggere ulteriori informazioni sulle chiavi esterne in i concetti del database guida .