Nigdy nie „ręcznie kodowałem” kodu do tworzenia obiektów dla SQL Server, a decleracja klucza obcego jest pozornie różna dla SQL Server i Postgres. Oto mój SQL jak dotąd:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Po uruchomieniu zapytania pojawia się następujący błąd:
Msg 8139, poziom 16, stan 0, wiersz 9 Liczba kolumn referencyjnych w kluczu obcym różni się od liczby kolumn referencyjnych, tabela „bank pytań”.
Czy widzisz błąd?
sql
sql-server
tsql
mmattax
źródło
źródło
Odpowiedzi:
źródło
A jeśli chcesz utworzyć ograniczenie samodzielnie, możesz użyć ALTER TABLE
Nie polecałbym składni wspomnianej przez Sarę Chipps do tworzenia w tekście, tylko dlatego, że wolałbym nazywać własne ograniczenia.
źródło
Możesz także nazwać swoje ograniczenie klucza obcego, używając:
źródło
Podoba mi się odpowiedź AlexCuse, ale na coś, na co powinieneś zwrócić uwagę, gdy dodajesz ograniczenie klucza obcego, to sposób, w jaki chcesz, aby aktualizacje do referencyjnej kolumny w wierszu odnośnej tabeli były traktowane, a zwłaszcza jak chcesz usunąć wiersze w odnośniku stół do leczenia.
Jeśli ograniczenie zostanie utworzone w ten sposób:
.. wówczas aktualizacja lub usuwanie w tabeli odniesienia spowoduje wysadzenie z błędem, jeśli w tabeli odniesienia znajduje się odpowiedni wiersz.
To może być zachowanie, które chcesz, ale z mojego doświadczenia wynika, że znacznie częściej nie jest.
Jeśli zamiast tego utworzysz go w ten sposób:
... następnie aktualizacje i usuwanie w tabeli nadrzędnej spowodują aktualizacje i usuwanie odpowiednich wierszy w tabeli odwołań.
(Nie sugeruję, że domyślna powinna zostać zmieniona, domyślna pomyłka jest po stronie ostrożności, co jest dobre. Po prostu mówię, że jest to coś, na co osoba, która tworzy conststainty, powinna zawsze zwracać uwagę .)
Nawiasem mówiąc, można to zrobić, tworząc tabelę:
źródło
- To też zadziała. Może nieco bardziej intuicyjna konstrukcja?
źródło
Aby utworzyć klucz obcy w dowolnej tabeli
źródło
Jeśli chcesz utworzyć dwie kolumny tabeli w relacji za pomocą zapytania, spróbuj wykonać następujące czynności:
źródło
Tak jak ty, zwykle nie tworzę obcych kluczy ręcznie, ale jeśli z jakiegoś powodu potrzebuję skryptu, to zwykle tworzę go za pomocą studia zarządzania serwerem ms sql i przed zapisaniem zmian, wybieram Projektant tabel | Wygeneruj skrypt zmian
źródło
Ten skrypt dotyczy tworzenia tabel z kluczem obcym i dodałem ograniczenie integralności referencyjnej dla serwera sql .
źródło
Nekromancja.
Właściwie robienie tego poprawnie jest nieco trudniejsze.
Najpierw musisz sprawdzić, czy istnieje klucz podstawowy dla kolumny, do której chcesz ustawić swój klucz obcy.
W tym przykładzie tworzony jest klucz obcy w tabeli T_ZO_SYS_Language_Forms, odwołujący się do dbo.T_SYS_Language_Forms.LANG_UID
źródło
Zawsze używam tej składni do tworzenia ograniczenia klucza obcego między 2 tabelami
to znaczy
źródło