MySQL-fout 1215: kan geen beperking voor refererende sleutels toevoegen

Ik probeer mijn nieuwe schema door te sturen naar mijn db-server, maar ik weet niet waarom ik deze foutmelding krijg. Ik heb geprobeerd hier naar het antwoord te zoeken, maar alles wat ik heb gevonden, zegt dat ik de db-engine op Innodb moet instellen of ervoor moet zorgen dat de sleutels die ik als externe sleutel probeer te gebruiken primaire sleutels zijn in hun eigen tabellen . Ik heb beide dingen gedaan, als ik me niet vergis. Nog andere hulp die jullie zouden kunnen bieden?

Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

Uitvoering SQL-script voltooid: statements: 7 geslaagd, 1 mislukt

Hier is de SQL voor de bovenliggende tabellen.

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

Antwoord 1, autoriteit 100%

Ik vermoed dat Clients.Case_Numberen/of Staff.Emp_IDniet precies hetzelfde gegevenstype zijn als Clients_has_Staff.Clients_Case_Numberen Clients_has_Staff.Staff_Emp_ID.

Misschien zijn de kolommen in de bovenliggende tabellen INT UNSIGNED?

Ze moeten in beide tabellen exact hetzelfde gegevenstype zijn.


Antwoord 2, autoriteit 42%

Redenen waarom u een externe sleutelbeperkingsfout kunt krijgen:

  1. Je gebruikt InnoDB niet als engine op alle tafels.
  2. U probeert te verwijzen naar een niet-bestaande sleutel in de doeltabel. Zorg ervoor dat het een sleutelis in de andere tabel (het kan een primaire of unieke sleutel zijn, of alleen een key)
  3. De typen kolommen zijn niet hetzelfde (uitzondering is dat de kolom in de verwijzingstabel nullable kan zijn, zelfs als deze niet nullable is in de tabel waarnaar wordt verwezen).
  4. Als de PK/FK een varchar is, zorg er dan voor dat de sortering voor beide hetzelfde is.

Bijwerken:

  1. Een van de redenen kan ook zijn dat de kolom die u gebruikt voor ON DELETE SET NULLniet als null is gedefinieerd. Zorg er dus voor dat de kolom standaard op nul staat.

Controleer deze.


Antwoord 3, autoriteit 14%

Voor anderen dezelfde fout is mogelijk niet altijd te wijten aan kolomtype Mismatch, u kunt meer informatie over een MySQL Foriennn-sleutelfout achterhalen door opdracht

te geven

SHOW ENGINE INNODB STATUS;

U kunt een fout vinden bij de bovenkant van het afgedrukte bericht Zoiets als

kan geen index vinden in de tabel waarnaar wordt verwezen, waar de
Kolommen waarnaar wordt verwezen als de eerste kolommen of kolomtypen
In de tabel en de tabel waarnaar wordt vergeleken voor beperking.


Antwoord 4, Autoriteit 2%

FOUT 1215 is een irritante. explosie pil’s antwoord dekt de basis. U wilt ervoor zorgen dat u vanaf daar begint. Er zijn echter meer, veel subtielere gevallen om op te letten:

Wanneer u bijvoorbeeld probeert de primaire sleutels van verschillende tabellen te koppelen, moet u ervoor zorgen dat u de juiste ON UPDATEen ON DELETEOpties opgeven. B.v.:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

zal niet vliegen, omdat primaire toetsen (zoals id) niet NULLkunnen zijn.

Ik ben er zeker van, er zijn nog meer, op dezelfde manier subtiele problemen bij het toevoegen van dit soort beperkingen, daarom zorg er dan altijd voor dat de beperkingen en hun implicaties in uw huidige context logisch zijn. Veel succes met je fout 1215!


Antwoord 5

Controleer de collatie van de tabel, met behulp van SHOW TABLE STATUSU kunt informatie over de tabellen, inclusief de collatie controleren.

Beide tabellen moeten dezelfde sortering hebben.

Het is mij overkomen.


Antwoord 6

In mijn geval had ik een tabel verwijderd met SET FOREIGN_KEY_CHECKS=0en daarna SET FOREIGN_KEY_CHECKS=1. Toen ik de tabel ging herladen, kreeg ik error 1215. Het probleem was dat er een andere tabel in de database was met een externe sleutel naar de tabel die ik had verwijderd en opnieuw aan het laden was. Een deel van het herlaadproces omvatte het wijzigen van een gegevenstype voor een van de velden, waardoor de externe sleutel uit de andere tabel ongeldig werd, waardoor error 1215werd geactiveerd. Ik heb het probleem opgelost door de andere tabel te laten vallen en vervolgens opnieuw te laden met het nieuwe gegevenstype voor het betrokken veld.


Antwoord 7

Ik kreeg dezelfde foutmelding toen ik een fk probeerde toe te voegen. In mijn geval werd het probleem veroorzaakt door de PK van de FK-tafel die als niet-ondertekend was gemarkeerd.


Antwoord 8

Er is een valkuil die ik heb ondervonden met “Error 1215: Cannot add external key constraint” bij het gebruik van Laravel 4, vooral met JeffreyWay’s Laravel 4-generatoren.

In Laravel 4 kun je JeffreyWay’s Generators gebruiken om migratiebestanden te genereren om tabellen één voor één te maken, wat betekent dat elk migratiebestand één tabel genereert.
U moet zich ervan bewust zijn dat elk migratiebestand wordt gegenereerd met een tijdstempel in de bestandsnaam, wat de bestanden een volgorde geeft. De volgorde van genereren is ook de volgorde van de migratiebewerking wanneer u het Artisan CLI-commando “php artisan migreren” activeert.
Dus als een bestand vraagt om een externe sleutelbeperking die verwijst naar een sleutel die wel, maar nog niet wordt gegenereerd in een laatstgenoemd bestand, wordt de Error 1215 geactiveerd.
In dat geval moet u de volgorde van het genereren van migratiebestanden aanpassen. Genereer nieuwe bestanden in de juiste volgorde, kopieer de inhoud en verwijder vervolgens de ongeordende oude bestanden.


Antwoord 9

ik had hetzelfde probleem, mijn oplossing:

Vroeger:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL
  PRIMARY KEY (NoFilm)
  FOREIGN KEY (NoFilm) REFERENCES cassettes
);

Oplossing:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,
 PRIMARY KEY (NoFilm)
);

Ik hoop dat het helpt 😉


Antwoord 10

Ik had hetzelfde probleem.
Ik heb het opgelost door dit te doen:

Ik heb de volgende regel gemaakt in de
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Ik ontdekte deze oplossing nadat ik probeerde een tabel in mijn schemabuilder te importeren. Als het voor jou werkt, laat het me weten!

Veel succes!

Felipe Tércio


Antwoord 11

In mijn geval moest ik de FOREIGN KEY-controles uitschakelen omdat de brontabellen niet bestonden.

SET FOREIGN_KEY_CHECKS=0;


Antwoord 12

Ik wilde dit geval ook gewoon toevoegen voor VARCHARrefererende sleutelrelatie. Ik heb de afgelopen week geprobeerd dit uit te zoeken in MySQL Workbench 8.0 en kon de fout eindelijk oplossen.

Kort antwoord:
De tekenset en sortering van het schema, de tabel, de kolom, de verwijzingstabel, de verwijzingskolom en alle andere tabellen die naar de bovenliggende tabel verwijzen, moeten overeenkomen.

Lang antwoord:
Ik had een enum datatype in mijn tafel. Ik heb dit gewijzigd in VARCHARen ik kan de waarden van een referentietabel krijgen, zodat ik de bovenliggende tabel niet hoef te wijzigen om extra opties toe te voegen. Deze buitenlandse-belangrijke relatie leek eenvoudig, maar ik heb 1215 fout. arvind antwoord en de volgende Link suggereerden het gebruik van

SHOW ENGINE INNODB STATUS;

Aan het gebruik van deze opdracht heb ik de volgende uitgebreide beschrijving voor de fout zonder extra nuttige informatie

kan geen index vinden in de tabel waarnaar wordt verwezen, waar de
Kolommen waarnaar wordt verwezen als de eerste kolommen of kolomtypen
In de tabel en de tabel waarnaar wordt verwezen niet voor beperking.
Merk op dat het interne opslagtype enum en ingesteld is gewijzigd in
Tafels gemaakt met & GT; = InnoDB-4.1.12, en dergelijke kolommen in oude tafels
kan niet worden verwezen door dergelijke kolommen in nieuwe tabellen.
Raadpleeg http: //dev.mySQL .com / DOC / REFMAN / 8.0 / NL / INNODB-Foreign-Key-Conslaints.html voor de juiste definitie van buitenlandse sleutel.

Hierna gebruikte ik SET FOREIGN_KEY_CHECKS=0;zoals gesuggereerd door arvind bharadwaj en de link HIER HIER :

Dit gaf het volgende foutbericht:

Foutcode: 1822. Kan de externe-sleutelbeperking niet toevoegen. Missend
index voor beperking

Op dit punt heb ik het schema ‘reverse engineered’ en kon ik de externe-sleutelrelatie in het EER-diagram maken. Op ‘forward engineer’-ing kreeg ik de volgende foutmelding:

Fout 1452: Kan een onderliggende rij niet toevoegen of bijwerken: een externe sleutelbeperking
mislukt

Toen ik het EER-diagram ‘doorstuurde’ naar een nieuw schema, werkte het SQL-script zonder problemen. Bij het vergelijken van de gegenereerde SQL van de pogingen om de engineer door te sturen, ontdekte ik dat het verschil de tekenset en sortering was. De bovenliggende tabel, onderliggende tabel en de twee kolommen hadden een utf8mb4tekenset en utf8mb4_0900_ai_cisortering, maar er werd naar een andere kolom in de bovenliggende tabel verwezen met CHARACTER SET = utf8 , COLLATE = utf8_bin ;naar een andere onderliggende tabel.

Voor het hele schema heb ik de tekenset en sortering voor alle tabellen en alle kolommen als volgt gewijzigd:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Dit loste eindelijk mijn probleem met 1215-fout op.

Kanttekening:
De sortering utf8mb4_general_ciwerkt in MySQL Workbench 5.0 of hoger. Collation utf8mb4_0900_ai_ciwerkt alleen voor MySQL Workbench 8.0 of hoger. Ik denk dat een van de redenen waarom ik problemen had met de tekenset en het sorteren, te wijten is aan de MySQL Workbench-upgrade naar 8.0 ertussenin. Hier is een linkdie meer vertelt over deze verzameling.


Antwoord 13

Ik kan deze fout niet vinden

CREATE TABLE RATING (
Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 
PRIMARY KEY (Riv_Id, Mov_Id),
FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,
FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

Antwoord 14

Dit gebeurt ook als het type kolommen niet hetzelfde is.

bijv. als de kolom waarnaar u verwijst UNSIGNED INT is en de kolom waarnaar wordt verwezen is INT, dan krijgt u deze foutmelding.


Antwoord 15

Voor mij waren het de kolomtypes. GroteINT != INT.

Maar toen werkte het nog steeds niet.

Dus ik controleerde de motoren. Zorg ervoor dat Table1 = InnoDB en Table = InnoDB


Antwoord 16

Voor MySQL (INNODB) … krijg definities voor kolommen die u wilt linken

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

vergelijk en controleer of beide kolomdefinities

. hebben

dezelfde COLUMN_TYPE(lengte), dezelfde COLATION

kan handig zijn om te spelen zoals

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

Antwoord 17

Controleer op tabelcompatibiliteit. Als de ene tabel bijvoorbeeld MyISAMis en de andere InnoDB, kan dit probleem optreden.


Antwoord 18

Nog een reden: als u ON DELETE SET NULLAlle kolommen die in de buitenlandse sleutel worden gebruikt, moeten u null-waarden toestaan. Iemand anders gevonden dit in deze vraag .

Van mijn begrip zou het geen probleem zijn met betrekking tot gegevensintegriteit, maar het lijkt erop dat MySQL deze functie niet ondersteunt (in 5.7).


Antwoord 19

Wanneer deze fout zich toevoert omdat de tabel waarnaar de MyISAM-motor gebruikt, biedt dit antwoord een snelle manier om uw database te converteren, zodat alle Django Model Tables InnoDB: https://stackoverflow.com/a/15389961/2950621

Het is een opdracht Django Management genaamd Convert_to_innodb.


Antwoord 20

WOOO Ik heb het net gekregen! Het was een mix van veel al geposte antwoorden (InnoDB, Unsigned, enz.). Eén ding dat ik hier niet zag, is: als je FK op een PK richt, zorg er dan voor dat de bronkolom een ​​waarde heeft die logisch is. Als de PK bijvoorbeeld een middellange (8) is, moet u ervoor zorgen dat de bronkolom ook een middellange (8) bevat. Dat was een deel van het probleem voor mij.


Antwoord 21

Ik heb deze fout voor een heel andere reden ervaren. Ik gebruikte MySQL Workbench 6.3 voor het maken van mijn gegevensmodel (Awesome tool). Ik heb gemerkt dat wanneer de kolomorder die is gedefinieerd in de definitie van de buitenlandse sleutelbeperking van de buitenlandse sleutels niet in de sequentie van de tabelkolom past, wordt deze fout ook gegenereerd.

Het kostte me ongeveer 4 uur om al het andere te proberen, maar het controleren.

Nu werkt alles goed en kan ik terug naar coderen. : -)


Antwoord 22

Wanneer u probeert buitenlandse sleutel te maken bij het gebruik van Laravel Migration

Zoals dit voorbeeld:

Gebruikerstabel

   public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

kleurentabel

   public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

soms werkten eigenschappen niet

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

deze fout is opgetreden omdat de refererende sleutel (type) in [gebruikerstabel] verschilt van de primaire sleutel (type) in [kleurentabel]

Om dit probleem op te lossen, moet de primaire sleutel in [kleurentabel] worden gewijzigd

$table->tinyIncrements('id');


Als u de primaire sleutel $table->Increments('id');

gebruikt

u moet Integergebruiken als externe sleutel

   $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Als u de primaire sleutel $table->tinyIncrements('id');

gebruikt

u moet unsignedTinyIntegergebruiken als externe sleutel

   $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Als u de primaire sleutel $table->smallIncrements('id');

gebruikt

u moet unsignedSmallIntegergebruiken als externe sleutel

   $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Als u de primaire sleutel $table->mediumIncrements('id');

gebruikt

u moet unsignedMediumIntegergebruiken als externe sleutel

   $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Antwoord 23

Dus ik heb alle bovenstaande oplossingen geprobeerd, maar zonder succes. Ik mis misschien de fout in mijn tabellen – ik kon de oorzaak gewoon niet vinden en ik kreeg steeds fout 1215. Dus ik gebruikte deze oplossing.

In mijn lokale omgeving in phpMyAdmin heb ik gegevens uit de betreffende tabel geëxporteerd. Ik heb het formaat CSV geselecteerd. Terwijl ik nog steeds in phpMyAdmin was met de tabel geselecteerd, selecteerde ik “Meer->Opties”. Hier scrolde ik naar beneden naar “Kopieer tabel naar (database.table). Selecteer “Alleen structuur”. Hernoem de tabel iets, voeg misschien het woord “kopie” toe naast de huidige tabelnaam. Klik op “Go” Dit zal een nieuwe tabel. Exporteer de nieuwe tabel en importeer deze naar de nieuwe of andere server. Ik gebruik hier ook phpMyAdmin. Eenmaal geïmporteerd verander de naam van de tabel terug naar de originele naam. Selecteer de nieuwe tabel, selecteer importeren. Voor formaat selecteer CSV Haal het vinkje weg bij “controles buitenlandse sleutels inschakelen”. Selecteer “Go”. Tot nu toe werkt alles goed.

Ik heb mijn oplossing gepost op mijn blog.


Antwoord 24

Let ook op het gebruik van aanhalingstekens. Ik had in een script de volgende verklaring

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

maar de aanhalingstekens aan het einde waren onjuist. Het had moeten zijn:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL geeft helaas geen details over deze fout…


Antwoord 25

Een andere oorzaak van deze fout is dat je 2 of meer dezelfde tabelnamen hebt die dezelfde refererende sleutelnamen hebben. Dit gebeurt soms met mensen die modellerings- en ontwerpsoftware gebruiken, zoals Mysql Workbench, en later het script van het ontwerp genereren.


Antwoord 26

Ik weet dat ik ERG laat op het feest ben, maar ik wil het hier plaatsen zodat het wordt vermeld.

Naast al het bovenstaande advies om ervoor te zorgen dat velden identiek zijn gedefinieerd en tabeltypen dezelfde sortering hebben, moet u ervoor zorgen dat u niet de beginnersfout maakt om velden te koppelen waar gegevens in het KIND veld staat nog niet in het veld OUDER. Als u gegevens heeft die in het KIND-veld staan en die u nog niet in het OUDER-veld hebt ingevoerd, dan zal dat deze fout veroorzaken. Het is jammer dat de foutmelding niet wat nuttiger is.

Als u het niet zeker weet, maak dan een back-up van de tabel met de externe sleutel, verwijder alle gegevens en probeer vervolgens de externe sleutel te maken. Als het gelukt is, wat moet je dan doen!

Veel succes.


Antwoord 27

Dit is een subtiele versie van wat al is gezegd, maar in mijn geval had ik 2 databases (foo en bar). Ik heb eerst foo gemaakt en ik wist niet dat het verwijst naar een externe sleutel in bar.baz (die nog niet was gemaakt). Toen ik probeerde bar.baz te maken (zonder externe sleutels), kreeg ik steeds deze foutmelding. Na een tijdje rondkijken vond ik de externe sleutel in foo.

Dus, om een lang verhaal kort te maken: als je deze foutmelding krijgt, heb je mogelijk een reeds bestaande externe sleutel voor de tabel die wordt gemaakt.


Antwoord 28

Voor mij trad de 1215-fout op toen ik een dumpfile importeerde die was gemaakt door mysqldump, die de tabellen alfabetisch aanmaakt, wat in mijn geval buitenlandse sleutels veroorzaakte naar verwijzingen naar tabellen die later in het bestand werden gemaakt. (Rekwisieten voor deze pagina om erop te wijzen: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/)

Aangezien mysqldump tabellen alfabetisch ordent en ik de namen van tabellen niet wilde veranderen, volgde ik de instructies in het antwoord van JeremyWeir op deze pagina, waarin staat dat set FOREIGN_KEY_CHECKS = 0;bovenaan het dumpbestand moet worden geplaatst en SET FOREIGN_KEY_CHECKS = 1;onderaan het dumpbestand.

Die oplossing werkte voor mij.


Antwoord 29

Ik had hetzelfde probleem,

Dus ik ging naar de bovenliggende tabel en ik zag deze regel daar bij het maken van een verklaring.

ENGINE=InnoDB DEFAULT CHARSET=utf8;

Dus een onderliggende tabel toegevoegd aan die coderegel bij het maken ervan.


Antwoord 30

Zelfs ik had hetzelfde probleem. En de fout zat bij de “niet-ondertekende” marker in de FK’s tafel PK

Other episodes