sql >> Databasteknik >  >> RDS >> Oracle

hur man infogar främmande nyckel i en tabell

Jag är inte helt säker på vad du menar med "fel ID-inmatning", men jag antar att du menar ett ID som inte är giltigt, snarare än bara ett misstag (som att säga att någon är i en annan stad än där de verkligen är).

Den främmande nyckel-begränsningen betyder att värdet de anger i person tabell för city_id har att finnas som en primärnyckel i city tabell. De kan inte lägga in något gammalt värde som ett city_id , endast giltiga värden. Och motsvarande city rad kan då inte tas bort utan att antingen ta bort/ändra referensen i person tabell (t.ex. uppdatering till ett annat giltigt värde), eller - osannolikt i det här fallet - kaskad raderingen så att någon person poster för city är raderade.

Så låt oss säga att du skapar dina 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 tabell:

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

Sedan kan du lägga till en person som bor i New York genom att inkludera ID för den staden:

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

(SQL Fiddle )

Du avnormaliserar inte data i den matchande city rekord, så om det New York beslutade att ändra sitt namn tillbaka till New Amsterdam, säg, skulle det vara en enda uppdatering av city spela in och du skulle inte behöva röra någon person rekord för människor i den staden.

Om du försökte ta bort city rekord för New York, skulle du få ett felmeddelande (ORA-02292) som säger att det fanns en underordnad post. Du kan uppdatera person post för att ha ett city_id av 2 eller 3, och skulle då kunna ta bort New York. Tanken är att du inte kan göra detta av misstag och lämna föräldralösa data bakom sig - ett person_id pekar på en city som inte längre finns.

Om du försökte skapa en person spela in med ett city_id värde som inte matchar ett city.id värde:

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

... då skulle du få ett felmeddelande (ORA-02291) att den överordnade nyckeln - det vill säga ett matchande id värde i city tabeller - finns inte.

Du kan läsa mer om främmande nycklar i databaskoncepten guide .



  1. Hur man lagrar en IP i mySQL

  2. Problem med en datumextraktion i SQL Server

  3. Hur man ställer in psycopg2 med Google App Engine PostgreSQL-databas

  4. Returnera den sökta informationen från sqlite