Mam tabelę numerów telefonów posiadanych przez firmę i tabelę rekordów połączeń telefonicznych. Każdy rekord połączenia zawiera (inne niż zerowy) numer źródłowy i docelowy. Otrzymałem ograniczenie integralności, że albo numer źródłowy, albo numer docelowy, ale nie oba, mogą być liczbami, których nie ma w tabeli numerów telefonów (ponieważ są to numery nie będące własnością tej firmy). Innymi słowy, muszę zapewnić, że co najmniej jeden z nich jest obcym kluczem do tabeli numerów telefonu.Ograniczenie SQL: dwa atrybuty, co najmniej jeden klucz obcy zgodny w tej samej tabeli
create table phonenumber (
phonenum numeric(10,0) not null,
primary key (phonenum)
);
create table call_record (
URID varchar(20) not null,
c_src numeric(10,0) not null,
c_dst numeric(10,0) not null,
primary key (URID)
);
następujące dźwięki podobne do tego, co chcę, ale nie jest poprawny SQL:
constraint call_constraint check (
foreign key (c_src) references phonenumber (phonenum) or
foreign key (c_dst) references phonenumber (phonenum)
)
Czy istnieje sposób, aby określić to w DDL? Jeśli nie, w jaki sposób mogę napisać spust, aby to wymusić?
Nie można wrócić do testu til teraz , ale ten działa. Dzięki! Jestem na kursie SQL, ale wirtualne kolumny nie zostały omówione. Czy jest to powszechny lub "idealny" sposób egzekwowania takiego ograniczenia? Nie miałem silnej preferencji dla DDL nad wyzwalaczami, ale byłem zakłopotany w obu kierunkach. –
Moim zdaniem nie jest tak często spotykane zapotrzebowanie na takie ograniczenie, może to sygnalizować problem projektowania modelu danych. W przypadku jakichkolwiek innych czynników wyzwalających preferencje mógłbym zasugerować czytanie "wyzwalacze są złe". Jeśli chodzi o kolumny wirtualne, można z nimi zrobić więcej, sprawdź w artykule Oracle Magazine 2008 marca kolumna Toma Kyte'a w celu odniesienia: http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28asktom -087592.html –