it-swarm.com.de

Die Anweisung ALTER TABLE widersprach der FOREIGN KEY-Einschränkung

Ich habe ein Problem beim Versuch, meiner tblDomare -Tabelle einen Fremdschlüssel hinzuzufügen. was mache ich hier falsch

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

Fehlermeldung:

Die Anweisung ALTER TABLE widersprach der FOREIGN KEY-Einschränkung "FK _tblDomare _ PersN__5F7E2DAC". Der Konflikt ist in der Datenbank "almu0004", Tabelle "dbo.tblBana", Spalte 'BanNR' aufgetreten.

157
user3162932

Es ist vorgekommen, weil Sie versucht haben, einen Fremdschlüssel von tblDomare.PersNR Bis tblBana.BanNR Zu erstellen, aber/und die Werte in tblDomare.PersNR Stimmen nicht mit den Werten in tblBana.BanNR. Sie können keine Beziehung erstellen, die die referenzielle Integrität verletzt.

295
Smutje

Diese Abfrage war für mich sehr nützlich. Es werden alle Werte angezeigt, für die keine Übereinstimmungen vorliegen

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

Es ist möglich, den Fremdschlüssel mit ALTER TABLE-Tabellenname WITH NOCHECK ... zu erstellen, wodurch Daten zugelassen werden, die den Fremdschlüssel verletzen.

Option "ALTER TABLE tablename WITH NOCHECK ..." zum Hinzufügen des FK - Diese Lösung hat bei mir funktioniert.

26
Ankita Biswas

Versuchen Sie diese Lösung:

In Ihrer Tabelle befindet sich ein Datenelement, dessen zugehöriger Wert in der Tabelle, die Sie als Primärschlüsseltabelle verwenden möchten, nicht vorhanden ist. Machen Sie Ihre Tabelle leer oder fügen Sie den zugehörigen Wert der zweiten Tabelle hinzu.

23
PatsonLeaner

Führen Sie die folgenden Schritte aus, bevor Sie der Tabelle einen Fremdschlüssel hinzufügen

  1. Stellen Sie sicher, dass die Tabelle leer sein muss oder die Spaltendaten übereinstimmen sollten.
  2. Stellen Sie sicher, dass es nicht null ist.
  3. Wenn die Tabelle enthält, gehen Sie nicht zum Entwerfen und Ändern, sondern manuell.

    tabelle ändern Tabelle 1 Verweise auf Fremdschlüssel (Spaltenname) hinzufügen Tabelle 2 (Spaltenname)

    alter table Tabelle 1 alter column Spaltenname-Attribut nicht null

10
GirishBabuC

Ich denke, ein Spaltenwert in einer Fremdschlüsseltabelle sollte mit dem Spaltenwert der Primärschlüsseltabelle übereinstimmen. Wenn Sie versuchen, eine Fremdschlüsseleinschränkung zwischen zwei Tabellen zu erstellen, bei der sich der Wert in einer Spalte (der Fremdschlüssel) vom Spaltenwert der Primärschlüsseltabelle unterscheidet, wird die Nachricht ausgegeben.

Es wird daher immer empfohlen, nur die Werte in die Fremdschlüsselspalte einzufügen, die in der Primärschlüsseltabelle vorhanden sind.

Zum Beispiel. Wenn die Primärtabellenspalte die Werte 1, 2, 3 und in der Fremdschlüsselspalte die eingefügten Werte unterschiedlich sind, wird die Abfrage nicht ausgeführt, da erwartet wird, dass die Werte zwischen 1 und 3 liegen.

9
sam05

Bereinigen Sie Ihre Daten aus Ihren Tabellen und stellen Sie dann eine Beziehung zwischen ihnen her.

6
max

Probieren Sie DELETE die aktuellen Daten aus tblDomare.PersNR. Weil die Werte in tblDomare.PersNR Nicht mit den Werten in tblBana.BanNR Übereinstimmen.

5
Thinker Bell

ich hatte diesen Fehler auch als Smutje reffered sicherstellen, dass Sie keinen Wert in der Fremdschlüsselspalte Ihrer Basis - Fremdschlüsseltabelle haben, der nicht in Ihrer Referenztabelle ist, dh (jeder Wert in Ihrer Basis - Fremdschlüsseltabelle (Wert einer Spalte, die ist Fremdschlüssel) muss sich auch in Ihrer Referenztabellenspalte befinden.) Es empfiehlt sich, zuerst die Basis-Fremdschlüsseltabelle zu leeren und dann Fremdschlüssel festzulegen

3
ako

Smutje hat recht und Chad HedgeCock bot ein hervorragendes Beispiel für Laien. Ich möchte auf dem Beispiel von Chad aufbauen, indem ich eine Möglichkeit anbiete, diese Datensätze zu finden/zu löschen. Wir werden den Kunden als Elternteil und die Bestellung als Kind verwenden. Kunden-ID ist das gemeinsame Feld.

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

wenn Sie diesen Thread lesen ... erhalten Sie Ergebnisse. Das sind verwaiste Kinder. Wählen Sie * aus "Untergeordnetes Element bestellen" links "Übergeordnetes Element des Kunden" auf "Untergeordnetes Element".

Überprüfen Sie, wen Sie benötigen, um diese Zeilen zu löschen!

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

Führen Sie das erste Bit aus. Überprüfen Sie die Anzahl der Zeilen = was Sie erwartet haben

übernehmen Sie die Tran

commit tran 

Achtung. Jemandes schlampiges Programm hat Sie in dieses Chaos gebracht. Stellen Sie sicher, dass Sie das Warum verstanden haben, bevor Sie die Waisenkinder löschen. Möglicherweise muss der Elternteil wiederhergestellt werden.

2
greg

Sie sollten sehen, ob Ihre Tabellen Daten in den Zeilen enthalten. Wenn "Ja", sollten Sie die Tabelle (n) abschneiden, oder Sie können festlegen, dass sie die gleiche Anzahl von Daten bei tblDomare.PersNR Bis tblBana.BanNR Und umgekehrt haben.

2
adrianex03

die Daten, die Sie in eine Tabelle eingegeben haben (tbldomare), stimmen nicht mit den Daten überein, die Sie der Primärschlüsseltabelle zugewiesen haben. schreibe zwischen tbldomare und füge dieses Wort hinzu (mit nocheck) dann führe deinen Code aus.

sie haben beispielsweise eine Tabelle für diese Daten eingegeben

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

und Sie haben eine foreign key - Tabelle zugewiesen, um nur 1,2,3 zu akzeptieren.

sie haben zwei Möglichkeiten: Löschen Sie die Daten, die Sie in eine Tabelle eingegeben haben, und führen Sie den Code aus. eine andere ist, schreibe dieses Wort (mit nocheck) zwischen deinen Tabellennamen und füge es so hinzu

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

Dies passiert mir, da ich meine Datenbank entwerfe und bemerke, dass ich meinen Startwert auf meiner Haupttabelle ändere. Jetzt hat die relationale Tabelle keinen Fremdschlüssel auf der Haupttabelle.

Ich muss also beide Tabellen abschneiden, und es funktioniert jetzt!

2
Willy David Jr

In meinem Szenario mit EF habe ich beim Versuch, diesen neuen Fremdschlüssel für vorhandene Daten zu erstellen, fälschlicherweise versucht, die Daten nach dem Erstellen des Fremdschlüssels aufzufüllen (Verknüpfungen herzustellen).

Das Update besteht darin, Ihre Daten vor dem Erstellen des Fremdschlüssels zu füllen, da alle überprüft werden, um festzustellen, ob die Links tatsächlich gültig sind. Es könnte also unmöglich funktionieren, wenn Sie es noch nicht besiedelt hätten.

0
JeromeJ