sql >> Database >  >> RDS >> Oracle

hoe een externe sleutel in een tabel in te voegen

Ik weet niet helemaal zeker wat je bedoelt met 'verkeerde ID-invoer', maar ik neem aan dat je een ID bedoelt die niet geldig is, in plaats van alleen een fout (zoals zeggen dat iemand zich in een andere stad bevindt dan waar ze echt zijn).

De externe sleutelbeperking betekent dat de waarde die ze invoeren in de person tabel voor city_id heeft bestaan ​​als primaire sleutel in de city tafel. Ze kunnen geen oude waarde invoeren als een city_id , alleen geldige waarden. En de bijbehorende city rij kan dan niet worden verwijderd zonder de verwijzing in de person . te verwijderen/wijzigen tabel (bijv. bijwerken naar een andere geldige waarde), of - in dit geval onwaarschijnlijk - de verwijdering trapsgewijs uitvoeren zodat een person records voor de city worden verwijderd.

Dus laten we zeggen dat u uw tabellen maakt als:

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

Je hebt drie records in je city tafel:

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

Dan kun je een person toevoegen die in New York woont door de ID van die stad op te nemen:

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

(SQL Fiddle )

U denormaliseert de gegevens in de overeenkomende city niet record, dus als New York zou besluiten zijn naam terug te veranderen in Nieuw Amsterdam, bijvoorbeeld, zou dat een enkele update zijn van de city opnemen en u hoeft geen person aan te raken records voor mensen in die stad.

Als u heeft geprobeerd de city . te verwijderen record voor New York, krijgt u een foutmelding (ORA-02292) dat er een onderliggend record bestaat. Je zou de person kunnen updaten record om een ​​city_id . te hebben van 2 of 3, en zou dan New York kunnen verwijderen. Het idee is dat je dit niet per ongeluk kunt doen en verweesde gegevens achterlaten - een person_id wijzend naar een city die niet meer bestaat.

Als je hebt geprobeerd een person aan te maken opnemen met een city_id waarde die niet overeenkomt met een city.id waarde:

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

... dan krijg je een foutmelding (ORA-02291) dat de bovenliggende sleutel - dat wil zeggen, een overeenkomende id waarde in de city tabellen - bestaat niet.

U kunt meer lezen over externe sleutels in de databaseconcepten gids .



  1. Hoe FLOOR() werkt in MariaDB

  2. Lijst met tijdelijke tabelkolommen in mysql

  3. Hoe kan ik de stringwaarde van het datatype van Oracle bepalen aan de hand van de code?

  4. MySQL-fout #1005 (code 150)