Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment insérer une clé étrangère dans une table

Je ne suis pas tout à fait sûr de ce que vous entendez par "mauvaise pièce d'identité", mais je suppose que vous voulez dire une pièce d'identité qui n'est pas valide, plutôt qu'une simple erreur (comme dire que quelqu'un se trouve dans une ville différente de celle où il sont).

La contrainte de clé étrangère signifie que la valeur qu'ils entrent dans le person table pour city_id a exister en tant que clé primaire dans la city table. Ils ne peuvent pas mettre d'ancienne valeur en tant que city_id , seules les valeurs valides. Et la city correspondante la ligne ne peut alors pas être supprimée sans supprimer/modifier la référence dans le person table (par exemple, mise à jour vers une valeur valide différente), ou - peu probable dans ce cas - cascade de la suppression afin que toute person enregistrements pour la city sont supprimés.

Supposons que vous créiez vos tableaux en tant que :

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));

Vous avez trois enregistrements dans votre city tableau :

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');

Ensuite, vous pouvez ajouter une person qui vit à New York en incluant l'identifiant de cette ville :

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

(SQL Fiddle )

Vous ne dénormalisez pas les données dans la city correspondante record, donc si New York décidait de changer son nom en New Amsterdam, disons, ce serait une seule mise à jour de la city enregistrer et vous n'auriez pas à toucher à une person enregistrements pour les personnes de cette ville.

Si vous avez essayé de supprimer la city enregistrement pour New York, vous obtiendriez une erreur (ORA-02292) indiquant qu'un enregistrement enfant existait. Vous pouvez mettre à jour la person record pour avoir un city_id de 2 ou 3, et serait alors en mesure de supprimer New York. L'idée est que vous ne pouvez pas faire cela par accident et laisser des données orphelines - un person_id pointant vers une city qui n'existe plus.

Si vous avez essayé de créer une person enregistrer avec un city_id valeur qui ne correspond pas à un city.id valeur :

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

... alors vous obtiendrez une erreur (ORA-02291) indiquant que la clé parent - c'est-à-dire un id correspondant valeur dans la city tables - n'existe pas.

Vous pouvez en savoir plus sur les clés étrangères dans les concepts de base de données guider .