Kan een onderliggende rij niet toevoegen of bijwerken: een beperking van een refererende sleutel mislukt

tabel #1:

Veld Type Null Sleutel Standaard Extra
Gebruikers-ID int(11) NEE PRI NULL auto_increment
Wachtwoord varchar(20) NEE
Gebruikersnaam varchar(25) NEE
E-mail varchar(60) NEE

Antwoord 1, autoriteit 100%

Je krijgt deze foutmelding omdat je een rij probeert toe te voegen aan/bij te werken naar table2die geen geldige waarde heeft voor het veld UserIDop basis van de waarden die momenteel zijn opgeslagen in table1. Als je wat meer code plaatst, kan ik je helpen de specifieke oorzaak vast te stellen.


Antwoord 2, autoriteit 50%

Het betekent dat u in table2een UserID-waarde probeert in te voegen die niet bestaat in table1.


Antwoord 3, autoriteit 44%

Een eenvoudige hack kan zijn om externe sleutelcontroles uit te schakelen voordat een bewerking op de tafel wordt uitgevoerd. Gewoon opvragen

SET FOREIGN_KEY_CHECKS=0

Hierdoor wordt het matchen van externe sleutels met andere tabellen uitgeschakeld. Nadat u klaar bent met de tabel, schakelt u deze weer in

SET FOREIGN_KEY_CHECKS=1

Dit werkt vaak voor mij.


Houd er rekening mee dat u de gevarenzone invoert wanneer u dit doet. Hoewel er zeker geldige gebruiksgevallen zijn, moet u dit alleen doen als u zeker weet dat u de implicaties begrijpt.


4, Autoriteit 19%

Ik heb een andere rare zaak ontdekt: als je per ongeluk een buitenlandse sleutel van een Innodb-tabel naar een Myisam-tabel maakt, gooit MySQL deze fout op het moment van insert, zelfs als de gegevens anders geldig zijn.

Zie http://nick.zoic.org/art/mysql- Foreign-key-fout /


5, Autoriteit 6%

Dit kostte me een tijdje om erachter te komen. Simpel gezegd, de tabel die verwijst naar de andere tabel heeft al gegevens erin en een of meer van zijn waarden bestaan ​​niet in de bovenliggende tabel.

b.g.
Tabel2 heeft de volgende gegevens:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

TABEL1

UserID    Password    Username    Email
9         ********    JohnDoe     [email protected]

Als u tabel2 probeert te WIJZIGEN en een externe sleutel toevoegt, zal de query mislukken omdat UserID=5 niet bestaat in Tabel1.


Antwoord 6, autoriteit 4%

Als u een rij in tabel 1 hebt ingevoegd voordat u de externe sleutel in tabel 2 hebt gemaakt, krijgt u een beperkingsfout voor een externe sleutel, omdat de waarde voor automatisch verhogen 2 is in tabel 1 en 1 in tabel 2. Om dit op te lossen je moet tabel 1 afkappen en de waarde voor automatisch verhogen weer op 1 zetten. Dan kun je tabel 2 toevoegen.


Antwoord 7, autoriteit 4%

Zorg ervoor dat u de database-engine op InnoDB hebt ingesteld, want in MyISAM worden externe sleutels en transacties niet ondersteund


Antwoord 8, autoriteit 3%

Een kleine oplossing:
Maak de JoinColumn ‘nullable = true’ in Tabel1 en ‘UserID’ veld ‘insertable=false’ en ‘nullable=true’ in Tabel2.

In tabel1 entiteit:

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

In Table2-entiteit:

@Column(insertable = false, nullable = true)
private int UserID;

Antwoord 9, autoriteit 2%

Ik had net hetzelfde probleem, de oplossing is eenvoudig.

U probeert een id in de onderliggende tabel toe te voegen die niet bestaatin de bovenliggende tabel.

goed controleren, want InnoDB heeft de bug die soms de auto_increment-kolom vergroot zonder waarden toe te voegen, bijvoorbeeld INSERT ... ON DUPLICATE KEY


Antwoord 10, autoriteit 2%

Ik had een soortgelijk probleem. U probeert buitenlandse sleutel toe te passen op een tabel die inhoud heeft en de kolom niet onmerkbaar is. U hebt twee opties.

  1. Maak de kolom die u wilt toepassen Buitenlandse sleutels Breplavies op To Wees Anlutable. Op die manier is de buitenlandse sleutel van toepassing, wetende dat sommige velden ongetrouwbaar kunnen zijn. (Dit is wat ik deed. )
  2. Maak de kolom die u wilt toepassen Buitenlandse key-beperking op, schrijf een query om de buitenlandse sleutel in de kolom in te voegen en breng vervolgens de beperkingen buitenlandse sleutels aan. (heeft dit niet geprobeerd, maar het zou ) moeten werken

11, Autoriteit 2%

Zorg ervoor dat de waarde die u in de buitenlandse sleutel invoegt, bestaat in de bovenliggende tabel. Dat heeft me geholpen. Als u bijvoorbeeld user_id = 2invoegt in table.2, maar table.1heeft geen user_id = 2, dan zal de beperking een fout gooien. De mijne was foutcode # 1452 om precies te zijn. Ik hoop dat dit iemand anders met hetzelfde probleem helpt!


12

Ik had hetzelfde probleem, en de reden was dat ik een rij in de eerste tabel had voordat ik de buitenlandse sleutel toevoegt.


13

Verwijder indexen van het UserID-veld van Tabel2. De pakken voor mij


14

Ik heb ook voor hetzelfde probleem geconfronteerd en het probleem was mijn bovenliggende tabelvermeldingen Waarde niet overeen met Buitenlandse sleuteltabelwaarde.
Dus probeer alsjeblieft na het wissen van alle rijen ..


15

In het geval dat de oplossingen van anderen niet werkten. Dan moet u proberen de database-engines van de ouder- en kindertafels te controleren. In mijn geval had ik de motor van de bovenliggende tafels in op “MyISAM”, waarbij ik het naar InnoDB veranderde.

Ik hoop dat dit anderen helpt die vastzitten als ik.


16

U mag geen ONDELETE-veld plaatsen tegen een cascade in de database.

Zet dus het onderontanktveld in om

te beperken

Veel geluk ♥


17

Nog een ander raar geval dat me deze fout gaf. Ik heb ten onrechte mijn buitenlandse sleutels verwijst naar de ID-primaire sleutel. Dit werd veroorzaakt door onjuiste opdrachten voor altertabel. Ik heb dit gevonden door het verzenden van de informatie_schema-tabel (zie dit stackoverflow antwoord)

De tabel was zo in de war dat het niet kan worden vastgesteld door elke -tabel -opdrachten. Ik heb eindelijk de tafel laten vallen en reconstrueerde het. Dit rijdt van de integriteiterror.


18

Misschien voegde u de userID-kolom toe, er is een gegevens voor die bepaalde tabel die het is vastgesteld, zodat het een standaardwaarde van 0heeft, probeer het toe te voegen kolom zonder de NOT NULL


19

Ik kreeg ook deze foutmelding: “Kan een kind rij niet toevoegen of updaten: een buitenlandse sleuteldienst faalt”. Ik heb de foutmelding bij het toevoegen van een nieuwe rij aan de bovenliggende tabel

Het probleem was dat de beperking van de buitenlandse sleutels was gedefinieerd in de bovenliggende tabel in plaats van de kindertafel.


20

İF U gebruikt MySQL-index of -relatie tussen tabellen, eerst verwijdert u de colums (bijvoorbeeld: City_ID) en creëer u nieuwe colums met dezelfde naam (bijvoorbeeld: City_ID). Denk aan het opnieuw …


21

Zijn er bestaande gegevens die de tabel bevat?
Als dit het geval is, probeer dan alle gegevens in de tabel op te lossen die u een buitenlandse sleutel wilt toevoegen.
Voer vervolgens de code uit (voeg een buitenlandse sleutel toe) opnieuw.

Ik heb dit probleem zo vaak tegengekomen. Dit opruiming van de alle gegevens in de tabel werkt wanneer u buitenlandse sleutel op een bestaande tabel wilt toevoegen.

Ik hoop dat dit werkt 🙂


22

Die fout treedt op wanneer u een buitenlandse sleutel wilt toevoegen met waarden die niet bestaan ​​in de primaire sleutel van de bovenliggende tabel. U moet er zeker van zijn dat de nieuwe Buitenlandse Key Userid in Tabel2 waarden heeft die bestaan ​​in de tabel 1 primaire sleutel, soms standaard is het niet-nul of gelijk aan 0.

U kunt eerst alle velden van de buitenlandse sleutel in Tabel2 bijwerken met een waarde die bestaat in de primaire sleutel van Tabel1.

update table2 set UserID = 1 where UserID is null

Als u verschillende gebruikersids wilt toevoegen, moet u elke rij wijzigen met de gewenste waarden.


23

Kindertafel Buitenlandse Key Constraint Failing

Dit probleem kan stijgen als gevolg van de volgende reden:

Als u het in de lente MVC doet, moet u het ID-type expliciet beschrijven, omdat MySQL soms het type ID niet herkent. Dus je hebt het expliciet ingesteld als in beide tabellen in je entiteitsklasse @GeneratedValue (strategy = GenerationType.IDENTITY)

Other episodes