De ALTER TABLE-instructie was in strijd met de FOREIGN KEY-beperking

Ik heb een probleem bij het toevoegen van een externe sleutel aan mijn tblDomare-tabel; wat doe ik hier verkeerd?

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

Foutbericht:

De ALTER TABLE-instructie was in strijd met de FOREIGN KEY-beperking “FK_tblDomare_PersN__5F7E2DAC”. Het conflict deed zich voor in database “almu0004”, tabel “dbo.tblBana”, kolom ‘BanNR’.


Antwoord 1, autoriteit 100%

Het gebeurde omdat u probeerde een externe sleutel te maken van tblDomare.PersNR naar tblBana.BanNR maar/en de waarden in tblDomare.PersNR kwam niet overeen met een van de waarden in tblBana.BanNR. U kunt geen relatie creëren die de referentiële integriteit schendt.


Antwoord 2, autoriteit 15%

Deze vraag was erg nuttig voor mij. Het toont alle waarden die geen overeenkomsten hebben

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)

Antwoord 3, autoriteit 12%

Probeer deze oplossing:

Er is een gegevensitem in uw tabel waarvan de bijbehorende waarde niet bestaat in de tabel die u als primaire-sleuteltabel wilt gebruiken.
Maak je tafel leeg of voeg de bijbehorende waarde toe aan de tweede tafel.


Antwoord 4, autoriteit 7%

Het is mogelijk om de refererende sleutel aan te maken met ALTER TABLE tablename WITH NOCHECK …, waardoor data mogelijk is die de refererende sleutel schenden.

“ALTER TABLE tablename WITH NOCHECK …” optie om de FK toe te voegen — Deze oplossing werkte voor mij.


Antwoord 5, autoriteit 4%

Ik denk dat een kolomwaarde in een refererende-sleuteltabel moet overeenkomen met de kolomwaarde van de primaire-sleuteltabel. Als we proberen een externe-sleutelbeperking te creëren tussen twee tabellen waarbij de waarde in één kolom (die de externe sleutel wordt) verschilt van de kolomwaarde van de primaire-sleuteltabel, dan wordt het bericht gegenereerd.

Het wordt dus altijd aanbevolen om alleen die waarden in de kolom Foreign key in te voegen die aanwezig zijn in de kolom Primaire sleuteltabel.

Bijvoorbeeld. Als de primaire tabelkolom waarden 1, 2, 3 heeft en in de kolom Foreign key zijn de ingevoegde waarden anders, dan wordt de query niet uitgevoerd omdat verwacht wordt dat de waarden tussen 1 & 3.


Antwoord 6, autoriteit 4%

Doe het volgende voordat u een externe sleutel aan de tabel toevoegt

  1. Zorg ervoor dat de tabel leeg moet zijn of dat de kolomgegevens moeten overeenkomen.
  2. Zorg ervoor dat het niet null is.
  3. Als de tabel niet naar ontwerpen en wijzigen bevat, doe het dan handmatig.

    tabel wijzigen Tabel 1 referenties voor refererende sleutel (kolomnaam) toevoegen Tabel 2 (kolomnaam)

    tabel wijzigen Tabel 1 kolom wijzigen Kolomnaam attribuut niet null


Antwoord 7, autoriteit 3%

Schoon uw gegevens uit uw tabellen en maak er een relatie tussen.


Antwoord 8, autoriteit 2%

Probeer DELETE de huidige gegevens van tblDomare.PersNR . Omdat de waarden in tblDomare.PersNR niet overeenkwamen met de waarden in tblBana.BanNR.


Antwoord 9

Als u een Foreign Key definieert in tabel B die verwijst naar de primaire sleutel van tabel A, betekent dit dat wanneer een waarde in B staat, deze in A moet staan. Dit is om inconsistente wijzigingen aan de tabellen te voorkomen.

In uw voorbeeld bevatten uw tabellen:

tblDomare met PRIMARY KEY (PersNR):

PersNR     |fNamn     |eNamn      |Erfarenhet
----------- | ---------- | ----------- | ----------
6811034679 |'Bengt'   |'Carlberg' |10
7606091347 |'Josefin' |'Backman'  |4
8508284163 |'Johanna' |'Backman'  |1
---------------------------------------------

tblBana:

BanNR
-----
1
2
3
-----

Deze verklaring:

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

zegt dat elke regel in tblDomare met sleutel PersNR een overeenkomst moet hebben in tabel tblBana op sleutel BanNR . Uw fout is dat u regels heeft ingevoegd in tblDomare zonder correspondentie in tblBana.

2 oplossingen om uw probleem op te lossen:

  • ofwel voeg regels toe in tblBana met BanNR in (6811034679, 7606091347, 8508284163)
  • of verwijder alle regels in tblDomare die geen correspondentie hebben in tblBana (maar uw tabel zou leeg zijn)

Algemeen advies: u moet de beperking van de Foreign Key hebben voordat u de tabellen invult. Buitenlandse sleutels zijn hier om te voorkomen dat de gebruiker van de tabel de tabellen met inconsistenties vult.


Antwoord 10

ik had deze fout ook
zoals Smutje aangaf, zorg ervoor dat u geen waarde in de refererende-sleutelkolom van uw basis-externe-sleuteltabel hebt die niet in uw referentietabel staat, dwz (elke waarde in uw basis-externe-sleuteltabel (waarde van een kolom die een externe sleutel is) moet ook in uw referentietabelkolom staan)
het is goed om eerst de tabel met buitenlandse sleutels leeg te maken en vervolgens buitenlandse sleutels in te stellen


Antwoord 11

Smutje heeft gelijk en Chad HedgeCock gaf een geweldig voorbeeld van een leek.
Ik wil graag voortbouwen op het voorbeeld van Chad door een manier aan te bieden om die records te vinden/verwijderen.
We gebruiken de klant als de ouder en de bestelling als het kind. Klant-ID is het algemene veld.

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

als je deze thread leest… krijg je resultaten. Dit zijn weeskinderen. selecteer * van Bestel Kind
left join Customer Parent op Child.CustomerId = Parent.CustomerId
waarbij Parent.CustomerId null is. Let op het aantal rijen rechtsonder.

Verifieer met wie je maar wilt dat je deze rijen gaat verwijderen!

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

Voer het eerste bit uit.
Controleer dat aantal rijen = wat u verwachtte

maak de tran

commit tran 

Wees voorzichtig. Iemands slordige programmering heeft je in deze puinhoop gebracht. Zorg ervoor dat u het waarom begrijpt voordat u de wezen verwijdert. Misschien moet de ouder worden hersteld.


Antwoord 12

de gegevens die u in een tabel hebt ingevoerd (tbldomare) komen niet overeen met de gegevens die u aan een primaire sleuteltabel heeft toegewezen. schrijf tussen tbldomare en voeg dit woord toe (zonder vinkje) en voer dan je code uit.

u hebt bijvoorbeeld een tabel ingevoerd met deze gegevens

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

en je hebt een tabel foreign key toegewezen om alleen 1,2,3 te accepteren.

je hebt twee oplossingen: verwijder de gegevens die je in een tabel hebt ingevoerd en voer vervolgens de code uit. een ander is schrijf dit woord (zonder vinkje) plaats het tussen je tabelnaam en voeg toe
zoals dit

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

Antwoord 13

Dit overkomt mij, aangezien ik mijn database aan het ontwerpen ben, merk ik dat ik mijn seed op mijn hoofdtabel verander, nu heeft de relationele tabel geen externe sleutel in de hoofdtabel.

Dus ik moet beide tabellen afkappen, en het werkt nu!


Antwoord 14

U zou moeten kijken of uw tabellen gegevens in de rijen bevatten. Indien “ja”, dan moet u de tabel(len) afkappen, anders kunt u ervoor zorgen dat ze hetzelfde aantal gegevens hebben op tblDomare.PersNR tot tblBana.BanNR en bankschroef -vers.


Antwoord 15

In mijn scenario, waarbij ik EF gebruikte, probeerde ik bij het maken van deze nieuwe externe sleutel op bestaande gegevens ten onrechte de gegevens te vullen (de koppelingen te maken) NA het maken van de externe sleutel.

De oplossing is om uw gegevens in te vullen voordat u de externe sleutel maakt, aangezien deze alle gegevens controleert om te zien of de links inderdaad geldig zijn. Het zou dus onmogelijk kunnen werken als je het nog niet hebt ingevuld.


Antwoord 16

Verwijder eerst gegevens uit die tabel en voer de migratie vervolgens opnieuw uit. Je krijgt succes


Antwoord 17

Ik kom een ​​probleem tegen in mijn project.

voer hier de afbeeldingsbeschrijving in

In de onderliggende tabel is er geen record-ID die gelijk is aan 1 en 11

mage

Ik heb DEAL_ITEM_THIRD_PARTY_PO tabel ingevoegd waarvan Id gelijk is aan 1 en 11, dan kan ik FK maken


Antwoord 18

Van onze kant is dit het scenario:

  1. We hebben een bestaande tabel in de database met records.
  2. Dan introduceer ik een NIET nullable externe sleutel
  3. Na het uitvoeren van de update kreeg ik deze foutmelding.

Hoe heb ik je vraag opgelost?

OPLOSSING: ik heb zojuist alle records van de tabel verwijderd en vervolgens geprobeerd de database bij te werken en dat is gelukt.


Antwoord 19

Ik had hetzelfde probleem.
Ik had een probleem met nullable: true in kolom (migratiebestand):

AddColumn("dbo.table", "column", c => c.Int(nullable: true));

Mogelijke oplossingen:

  1. Verander nullable ‘false’ in ‘true’. (Niet aanbevolen)
  2. Eigenschapstype wijzigen van int in int? (aanbevolen)

En indien nodig, verander dit later na het toevoegen van kolom > dan ontbrekende veldgegevens in eerdere records

Als u een bestaande eigenschap heeft gewijzigd van nullable in non-nullable:
3) Vul de kolomgegevens in databaserecords in


Antwoord 20

Een externe-sleutelbeperking in een onderliggende tabel moet een bovenliggende tabel met een primaire sleutel hebben. De primaire sleutel moet uniek zijn. De waarde van de refererende sleutel moet overeenkomen met een waarde in de primaire sleutel van de octrooitabel


Antwoord 21

of je kunt dit gebruiken

SELECT  fk_id FROM dbo.tableA
Except
SELECT fk_id From dbo.tableB

Antwoord 22

en alleen ter informatie, voor het geval u al uw gegevensreferentiecontroles uitvoert en geen slechte gegevens vindt… is het blijkbaar niet mogelijk om een ​​externe sleutelbeperking te creëren tussen twee tabellen en velden waarbij die velden de primaire sleutel zijn in beide tafels! Vraag me niet hoe ik dit weet.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes