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

hvordan man indsætter fremmednøgle i en tabel

Jeg er ikke helt sikker på, hvad du mener med "forkert id-input", men jeg vil antage, at du mener et id, som ikke er gyldigt, snarere end blot en fejl (som at sige, at nogen er i en anden by, end hvor de virkelig er).

Den fremmede nøgle begrænsning betyder, at den værdi, de indtaster i person tabel for city_id har at eksistere som en primær nøgle i city bord. De kan ikke indsætte nogen gammel værdi som en city_id , kun gyldige værdier. Og den tilsvarende city rækken kan derefter ikke slettes uden enten at fjerne/ændre referencen i person tabel (f.eks. opdatering til en anden gyldig værdi), eller - usandsynligt i dette tilfælde - kaskadering af sletningen, så enhver person poster for city slettes.

Så lad os sige, at du opretter dine tabeller som:

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

Du har tre poster i din city tabel:

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

Derefter kan du tilføje en person der bor i New York ved at inkludere ID for den by:

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

(SQL Fiddle )

Du denormaliserer ikke dataene i den matchende city rekord, så hvis det New York besluttede at ændre sit navn tilbage til New Amsterdam, for eksempel, ville det være en enkelt opdatering af city optag, og du behøver ikke røre nogen person optegnelser for folk i den by.

Hvis du forsøgte at slette city record for New York, vil du få en fejl (ORA-02292), der siger, at der eksisterede en underordnet post. Du kan opdatere person record for at have et city_id af 2 eller 3, og ville derefter være i stand til at slette New York. Tanken er, at du ikke kan gøre dette ved et uheld og efterlade forældreløse data - et person_id peger på en city der ikke længere eksisterer.

Hvis du forsøgte at oprette en person optage med et city_id værdi, der ikke matcher en city.id værdi:

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

... så får du en fejl (ORA-02291) om, at den overordnede nøgle - det vil sige et matchende id værdi i city tabeller - findes ikke.

Du kan læse mere om fremmednøgler i databasekoncepterne guide .



  1. SQL OG Operator for begyndere

  2. Konvertering af streng med forkortet tidszone til tidsstempel

  3. Rails 5.2 ActiveStorage med UUID'er på Postgresql

  4. MySQL Vælg specifik kolonne