2016-04-20 8 views
0

Ich lerne MYSQL zu verwenden (auf Xamp App für Mac OS X mit MariaDB) und ich bin fest ...Probleme mit SQL mit Zwang und Fremdschlüssel

Wenn ich will Tabelle ändern Einschränkung hinzufügen mit Fremdschlüssel, bekomme ich diesen Fehler:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`db_forum`.`#sql-2d52_2f4`, CONSTRAINT `CO_FK_message` FOREIGN KEY (`FK_message`) REFERENCES `T_message` (`ID_message`))

Aber ich habe gerade die EXACT Aktion vor in meinem Skript (für eine andere Tabelle) und es funktioniert ganz gut ...

ich sah schon hier: http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html aber hat überhaupt nicht geholfen.

Der Fehler wird nur mit den letzten 4 Zeilen angezeigt.

Hier ist mein Skript:

/* commentaire debggg drop */ 
DROP DATABASE IF EXISTS db_forum; 
CREATE DATABASE IF NOT EXISTS db_forum; 
USE db_forum; 


CREATE TABLE T_message 
(
ID_message int NOT NULL AUTO_INCREMENT, 
text_MSG VARCHAR(255), 
datecrea_MSG DATE NOT NULL, 
PRIMARY KEY (ID_message) 
)ENGINE = InnoDB ; 


CREATE TABLE T_user 
(
ID_user int NOT NULL AUTO_INCREMENT, 
prenom_user VARCHAR(50), 
nom_user VARCHAR(50), 
datenaissance_user DATE NOT NULL, 
email_user VARCHAR(30), 
account_user VARCHAR(16), 
password_user VARCHAR(16), 
PRIMARY KEY (ID_user) 
)ENGINE = InnoDB ; 


CREATE TABLE T_thread 
(
ID_thread int NOT NULL AUTO_INCREMENT, 
datecrea_thread DATE NOT NULL, 
titre_thread VARCHAR(30), 
PRIMARY KEY (ID_thread) 
)ENGINE = InnoDB ; 

CREATE TABLE T_posted 
(
ID_posted int NOT NULL AUTO_INCREMENT, 
FK_user int NOT NULL, 
FK_message int NOT NULL, 
PRIMARY KEY (ID_posted), 
CONSTRAINT CO_FK_message FOREIGN KEY (FK_message) REFERENCES T_message (ID_message), 
CONSTRAINT CO_FK_user FOREIGN KEY (FK_user) REFERENCES T_user (ID_user) 
)ENGINE = InnoDB ; 

CREATE TABLE T_manyMSG 
(
ID_manyMSG int NOT NULL AUTO_INCREMENT, 
FK_thread int NOT NULL, 
FK_message int NOT NULL, 
PRIMARY KEY (ID_manyMSG), 
CONSTRAINT CO_FK_thread FOREIGN KEY (FK_thread) REFERENCES T_thread (id_thread), 
CONSTRAINT CO_FK_MSG FOREIGN KEY (FK_message) REFERENCES T_message (id_message) 
)ENGINE = InnoDB ; 


/* IMPORTE DATA */ 

/* table T_user/ AJOUT DATA */ 
LOAD DATA LOCAL INFILE '/Volumes/Local_SSD/Applications/XAMPP/xamppfiles/htdocs/forum/sql/import_data_user.csv' 

    INTO TABLE T_user 

    FIELDS TERMINATED BY ';' 
    LINES TERMINATED BY '\n' 
    IGNORE 1 LINES 
    (prenom_user,nom_user,datenaissance_user,email_user,account_user,password_user); 

    /* ajout manuel de compte administrateur pour forum et compte test */ 
INSERT INTO T_user (prenom_user, nom_user, datenaissance_user, email_user, account_user, password_user) 
VALUES ('Joel', 'lawl', '1990-10-20','[email protected]','admin','1234'), 
('bernard', 'plowz', '1980-11-22','[email protected]','test','12345'); 


/* table T_message/AJOUT DATA */ 
LOAD DATA LOCAL INFILE '/Volumes/Local_SSD/Applications/XAMPP/xamppfiles/htdocs/forum/sql/import_data_message.csv' 

    INTO TABLE T_message 

    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n' 
    IGNORE 1 LINES 
    (text_MSG,datecrea_MSG); 

/* AJOUT MANUEL POUR TEST */  
INSERT INTO T_message (text_MSG, datecrea_MSG) 
VALUES ('bonjour','2016-01-20'), 
('salut','2016-02-20'); 

/* Desactivation des FK_message pour ajout de data dans table/T_posted */ 
/* ATTENTION Ceci prend effet après 1 minutes */ 
/* ATTENTION, CES COMMANDES FONCTIONE PARFAITEMENT AVEC L'ENGINE SERVEUR MARIADB (SUR XAMP MAC OS X) */ 

ALTER TABLE `db_forum`.`T_posted` 
DROP FOREIGN KEY `CO_FK_message`; 
ALTER TABLE `db_forum`.`T_posted` 
DROP INDEX `CO_FK_message` ; 



/* Desactivation des FK_user pour ajout de data dans table/T_posted */ 
/* ATTENTION Ceci prend effet après 1 minutes */ 
/* ATTENTION, CES COMMANDES FONCTIONE PARFAITEMENT AVEC L'ENGINE SERVEUR MARIADB (SUR XAMP MAC OS X) */ 

ALTER TABLE `db_forum`.`T_posted` 
DROP FOREIGN KEY `CO_FK_user`; 
ALTER TABLE `db_forum`.`T_posted` 
DROP INDEX `CO_FK_user` ; 


/* table T_posted * AJOUT DATA */ 
LOAD DATA LOCAL INFILE '/Volumes/Local_SSD/Applications/XAMPP/xamppfiles/htdocs/forum/sql/import_data_posted.csv' 

    INTO TABLE T_posted  

    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n' 
    IGNORE 1 LINES 
    (FK_user,FK_message); 

/* AJOUT MANUEL POUR TEST JOIN */ 
INSERT INTO T_posted (FK_user, FK_message) 
VALUES ('128','1024'), 
('129','1025'); 



/* THIS ONE WORK */ 

ALTER TABLE T_posted 
ADD CONSTRAINT CO_FK_user 
FOREIGN KEY (FK_user) 
REFERENCES T_user(ID_user); 

/* THIS ONE DONT WORK =/ */ 

ALTER TABLE T_posted 
ADD CONSTRAINT CO_FK_message 
FOREIGN KEY (FK_message) 
REFERENCES T_message(ID_message); 

Antwort

0

das Problem ist in der ALTER TABLE-Anweisung nicht.

Sie, wenn Sie die Daten einfügen, sollten Sie überprüfen, dass es keine Probleme mit den Einschränkungen gibt.

Es scheint, dass Sie einen Fremdschlüssel einfügen, der nicht als Primärschlüssel vorhanden ist.

Sie sollten auch die ALTER-Anweisungen vor dem Einfügen der Daten vornehmen.

Mit freundlichen Grüßen,

+0

Eigentlich ist es wie es funktionieren: 1) Ich schaffe Tabelle mit Zwang und ausländischen verknüpft. 2) Ich lasse sie für Einfügedaten fallen (sie passen direkt in Tabellen). 3) Ich ändere Tabelle, um die Einschränkung und den Fremdschlüssel erneut hinzuzufügen. Ich habe auch versucht, Schritt für Schritt, es funktioniert gut (Hinzufügen von Daten, Hinzufügen der ersten Einschränkung), so dass ich glaube nicht, dass das das Problem ist? – Trowz

+0

Wenn die Daten gut strukturiert sind. Das erneute Hinzufügen der Fremdschlüssel sollte kein Problem sein. Ich denke, Sie müssen die Daten aus den Tabellen T_message und T_posted überprüfen. Überprüfen Sie, ob es eine oder mehrere FK_Message (von T_posted) gibt, die nicht als ID_message (von T_message) existiert. – pateto777

+0

Ok, thx viel, ich werde dies morgen betrachten und aktualisieren, wenn gelöst. – Trowz