Mam problem podczas próby dodania klucza obcego do mojej tblDomare
tabeli; co ja tu robię źle?
CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);
CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));
INSERT INTO tblBana (BanNR)
Values (1);
INSERT INTO tblBana (BanNR)
Values (2);
INSERT INTO tblBana (BanNR)
Values (3);
ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
Komunikat o błędzie:
Instrukcja ALTER TABLE powoduje konflikt z ograniczeniem FOREIGN KEY „FK_ tblDomare _PersN__5F7E2DAC”. Konflikt wystąpił w bazie danych „almu0004”, tabela „dbo.tblBana”, kolumna „BanNR”.
sql
sql-server
database
user3162932
źródło
źródło
To zapytanie było dla mnie bardzo przydatne. Pokazuje wszystkie wartości, które nie mają żadnych dopasowań
select FK_column from FK_table WHERE FK_column NOT IN (SELECT PK_column from PK_table)
źródło
Wypróbuj to rozwiązanie:
źródło
Możliwe jest utworzenie klucza obcego przy użyciu polecenia ALTER TABLE nazwa tabeli WITH NOCHECK ..., co pozwoli na dane, które naruszają klucz obcy.
Opcja „ALTER TABLE tablename WITH NOCHECK ...”, aby dodać FK - To rozwiązanie zadziałało dla mnie.
źródło
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.DETACH) @JoinTable(name = "tbUsuariosTipoOcorrencia", joinColumns = { @JoinColumn(name = "idUsuario") }, inverseJoinColumns = { @JoinColumn(name = "idTipoOcorrencia") })
i zrobiłem to, rozwiązując za pomocą zapytania do bazy danych:alter table tbUsuariosTipoOcorrencia WITH NOCHECK add constraint FKnbxg3ua7b8c5d53wps69q6jh foreign key (idUsuario) references tbUsuarios
Wydaje mi się, że wartość kolumny w tabeli kluczy obcych powinna być zgodna z wartością kolumny w tabeli kluczy podstawowych. Jeśli próbujemy utworzyć ograniczenie klucza obcego między dwiema tabelami, w których wartość w jednej kolumnie (będzie to klucz obcy) różni się od wartości kolumny tabeli kluczy podstawowych, to wyśle komunikat.
Dlatego zawsze zaleca się wstawianie tylko tych wartości w kolumnie Klucz obcy, które są obecne w kolumnie tabeli kluczy podstawowych.
Na przykład. Jeśli kolumna Primary table ma wartości 1, 2, 3, aw kolumnie Foreign key wprowadzone wartości są różne, zapytanie nie zostanie wykonane, ponieważ oczekuje, że wartości będą znajdować się w przedziale od 1 do 3.
źródło
Przed dodaniem klucza obcego do tabeli wykonaj następujące czynności
Jeśli tabela zawiera nie idź do projektowania i zmiany, zrób to ręcznie.
zmień tabelę Tabela 1 dodaj odwołania do klucza obcego (Nazwa kolumny) Tabela 2 (Nazwa kolumny)
alter table Tabela 1 alter column Atrybut nazwy kolumny nie jest pusty
źródło
Wyczyść dane z tabel, a następnie utwórz relacje między nimi.
źródło
Wypróbuj
DELETE
aktualne dane ztblDomare.PersNR
. Ponieważ wartości wtblDomare.PersNR
nie pasują do żadnej z wartości wtblBana.BanNR
.źródło
Miałem również ten błąd, ponieważ odesłał Smutje upewnij się, że nie masz wartości w kolumnie klucza obcego w podstawowej tabeli kluczy obcych, której nie ma w tabeli referencyjnej, tj. (każda wartość w Twojej podstawowej tabeli kluczy obcych (wartość kolumny, która jest klucz obcy) musi również znajdować się w kolumnie tabeli referencyjnej) dobrze jest najpierw opróżnić podstawową tabelę kluczy obcych, a następnie ustawić klucze obce
źródło
dane wprowadzone do tabeli (tbldomare) nie pasują do danych, które przypisałeś do tabeli kluczy podstawowych. pisz między tbldomare i dodaj to słowo (z nocheck), a następnie wykonaj swój kod.
na przykład wpisałeś tabelę tbldomar te dane
INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) Values (6811034679,'Bengt','Carlberg',10);
i przypisałeś
foreign key
tabelę tylko do akceptacji1,2,3
.masz dwa rozwiązania, jedno to usunięcie danych wprowadzonych do tabeli, a następnie wykonanie kodu. innym jest napisanie tego słowa (z nocheck), umieszczenie go między nazwą tabeli i dodanie w ten sposób
ALTER TABLE tblDomare with nocheck ADD FOREIGN KEY (PersNR) REFERENCES tblBana(BanNR);
źródło
Dzieje się tak ze mną, ponieważ projektuję swoją bazę danych i zauważam, że zmieniam ziarno w mojej głównej tabeli, teraz tabela relacyjna nie ma klucza obcego na głównej tabeli.
Więc muszę obciąć obie tabele i teraz działa!
źródło
Powinieneś sprawdzić, czy twoje tabele zawierają jakieś dane w wierszach. Jeśli "tak", to powinieneś skrócić tabele lub możesz sprawić, by miały taką samą liczbę danych na
tblDomare.PersNR
totblBana.BanNR
i vise-verse.źródło
Smutje ma rację, a Chad HedgeCock dał świetny przykład laika. Chciałbym skorzystać z przykładu Chada, oferując sposób na znalezienie / usunięcie tych rekordów. Będziemy używać Klienta jako Rodzica i Porządku jako dziecka. CustomerId jest polem wspólnym.
select * from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null
jeśli czytasz ten wątek ... otrzymasz wyniki. To są osierocone dzieci. wybierz * z Order Child left dołącz do Customer Parent na Child.CustomerId = Parent.CustomerId gdzie Parent.CustomerId ma wartość null. Zwróć uwagę na liczbę wierszy w prawym dolnym rogu.
Idź i sprawdź z kimkolwiek potrzebujesz, że zamierzasz usunąć te wiersze!
begin tran delete Order from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null
Uruchom pierwszy bit. Sprawdź, czy liczba wierszy jest zgodna z oczekiwaniami
popełnij tran
commit tran
Bądź ostrożny. Czyjś niechlujny program wpędził cię w ten bałagan. Zanim usuniesz sieroty, upewnij się, że rozumiesz, dlaczego. Może trzeba przywrócić rodzica.
źródło
W moim scenariuszu, używając EF, próbując utworzyć nowy klucz obcy na istniejących danych, błędnie próbowałem wypełnić dane (utworzyć łącza) PO utworzeniu klucza obcego.
Rozwiązaniem jest wypełnienie danych przed utworzeniem klucza obcego, ponieważ sprawdza je wszystkie, aby sprawdzić, czy linki są rzeczywiście prawidłowe. Więc prawdopodobnie nie zadziała, jeśli jeszcze go nie zapełnisz.
źródło
Najpierw usuń dane z tej tabeli, a następnie ponownie uruchom migrację. Osiągniesz sukces
źródło
Kiedy definiujesz klucz obcy w tabeli B odwołując się do klucza podstawowego tabeli A, oznacza to, że gdy wartość znajduje się w B, musi znajdować się w A. Ma to na celu zapobieżenie niespójnym modyfikacjom tabel.
W Twoim przykładzie Twoje tabele zawierają:
tblDomare z
PRIMARY KEY (PersNR)
:PersNR |fNamn |eNamn |Erfarenhet -----------|----------|-----------|---------- 6811034679 |'Bengt' |'Carlberg' |10 7606091347 |'Josefin' |'Backman' |4 8508284163 |'Johanna' |'Backman' |1 ---------------------------------------------
tblBana:
BanNR ----- 1 2 3 -----
To oświadczenie:
ALTER TABLE tblDomare ADD FOREIGN KEY (PersNR) REFERENCES tblBana(BanNR);
mówi, że każda linia
tblDomare
z kluczemPersNR
musi mieć odpowiednik w tabelitblBana
na kluczBanNR
. Twój błąd wynika z tego, że masz wstawione wierszetblDomare
bez odpowiednikatblBana
.2 sposoby rozwiązania problemu: - albo dodaj wiersze za
tblBana
pomocąBanNR in (6811034679, 7606091347, 8508284163) - or remove all lines in
tblDomarethat have no correspondance in
tblBana` (ale twoja tabela będzie pusta)Porada ogólna : przed zapełnieniem tabel należy mieć ograniczenie klucza obcego. Klucze obce są tutaj, aby uniemożliwić użytkownikowi tabeli wypełnianie tabel niespójnościami.
źródło
W moim projekcie napotykam problem.
W tabeli podrzędnej nie ma żadnego rekordu o identyfikatorze równym 1 i 11
Wstawiłem tabelę DEAL_ITEM_THIRD_PARTY_PO, której identyfikator jest równy 1 i 11, a następnie mogę utworzyć FK
źródło
i po prostu do Twojej wiadomości, na wypadek, gdybyś sprawdził wszystkie swoje odniesienia do danych i nie znalazł żadnych złych danych ... najwyraźniej nie jest możliwe utworzenie ograniczenia klucza obcego między dwiema tabelami i polami, w których te pola są kluczem podstawowym w obu tabelach! Nie pytaj mnie, skąd to wiem.
źródło