2017-04-10 3 views
0

J'ai des problèmes avec Navicat sur Ubuntu 16.04 LTS, j'essaie d'exécuter le script, et il arrive à la dernière table en disant qu'il ne peut pas ajouter une contrainte de clé étrangère, voici mon script, est-ce que quelqu'un sait que je me trompe quelque part?MySQL n'ajoutera pas plus d'une clé étrangère à la même table

Merci à des conseils

Voici mon script SQL:

CREATE TABLE `SMER` (
    `Ssmer` INT(10) NOT NULL AUTO_INCREMENT, 
    `Nazivs` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`Ssmer`) 
    ); 

CREATE TABLE `Nastavnici` (
    `Snast` INT(10) NOT NULL AUTO_INCREMENT, 
    `Imen` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`Snast`) 
    ); 

CREATE TABLE `PREDMETI` (
    `SPRED` INT(10) NOT NULL AUTO_INCREMENT, 
    `NAZIVP` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`SPRED`) 
    ); 

CREATE TABLE `Studenti` (
    `Indeks` INT(10) NOT NULL, 
    `Upisan` INT(10) NOT NULL, 
    `Imes` VARCHAR(255) NOT NULL, 
    `Mesto` VARCHAR(255), 
    `Datr` DATETIME NOT NULL, 
    `Ssmer` INT(10) NOT NULL, 
    PRIMARY KEY (`Indeks`, `Upisan`), 
    CONSTRAINT `FK_Studenti_Ssmer` FOREIGN KEY (`Ssmer`) REFERENCES `SMER` (`Ssmer`) 
    ); 

CREATE TABLE `USLOVNI` (
    `Spred` INT(10) NOT NULL, 
    `UslPredmet` INT(10) NOT NULL, 
    PRIMARY KEY (`Spred`, `UslPredmet`), 
    CONSTRAINT `FK_Uslovni_Spred` FOREIGN KEY (`Spred`) REFERENCES `PREDMETI` (`SPRED`), 
    CONSTRAINT `FK_Uslovni_UslPredmet` FOREIGN KEY (`UslPredmet`) REFERENCES `PREDMETI` (`SPRED`) 
    ); 

CREATE TABLE `Planst` (
    `Ssmer` INT(10) NOT NULL, 
    `Spred` INT(10) NOT NULL, 
    `Semestar` VARCHAR(255) DEFAULT NULL, 
    PRIMARY KEY (`Ssmer`, `Spred`), 
    CONSTRAINT `FK_Planst_Ssmer` FOREIGN KEY (`Ssmer`) REFERENCES `SMER` (`Ssmer`), 
    CONSTRAINT `FK_Planst_Spred` FOREIGN KEY (`Spred`) REFERENCES `PREDMETI` (`SPRED`) 
    ); 

CREATE TABLE `Angazovanje` (
    `Snast` INT(10) NOT NULL, 
    `Spred` INT(10) NOT NULL, 
    `Ssmer` INT(10) NOT NULL, 
    PRIMARY KEY (`Snast`, `Spred`, `Ssmer`), 
    CONSTRAINT `FK_Angazovanje_Snast` FOREIGN KEY (`Snast`) REFERENCES `Nastavnici` (`Snast`), 
    CONSTRAINT `FK_Angazovanje_Spred` FOREIGN KEY (`Spred`) REFERENCES `PREDMETI` (`SPRED`), 
    CONSTRAINT `FK_Angazovanje_Ssmer` FOREIGN KEY (`Ssmer`) REFERENCES `SMER` (`Ssmer`) 
    ); 

CREATE TABLE `Prijave` (
    `Spred` INT(10) NOT NULL, 
    `Indeks` INT(10) NOT NULL, 
    `Upisan` INT(10) NOT NULL, 
    `Snast` INT(10) NOT NULL, 
    `Datump` DATETIME DEFAULT NOW(), 
    `Ocena` INT(2) NOT NULL, 
    PRIMARY KEY (`Spred`, `Indeks`, `Upisan`, `Datump`), 
    CONSTRAINT `FK_Prijave_Spred` FOREIGN KEY (`Spred`) REFERENCES `PREDMETI` (`SPRED`), 
    CONSTRAINT `FK_Prijave_Indeks` FOREIGN KEY (`Indeks`) REFERENCES `Studenti` (`Indeks`), 
    CONSTRAINT `FK_Prijave_Upisan` FOREIGN KEY (`Upisan`) REFERENCES `Studenti` (`Upisan`), 
    CONSTRAINT `FK_Prijave_Snast` FOREIGN KEY (`Snast`) REFERENCES `Nastavnici` (`Snast`) 
    ); 

Voici le message d'erreur:

 [Err] 1215 - Cannot add foreign key constraint 
+0

Collez également le message d'erreur exact? –

+0

Je ne suis pas sûr, mais il se pourrait que deux clés étrangères différentes pour une même table 'Studenti' ne soient pas autorisées (du moins pas dans toutes les versions de MySQL). Avez-vous toujours la même erreur si vous supprimez l'une des contraintes? Par exemple, essayez de supprimer la ligne 'CONSTRAINT FK_Prijave_Upisan FOREIGN KEY (Upisan) REFERENCES Studenti (Upisan), et dites-nous si l'erreur existe encore ... –

+0

Lorsque je supprime cette contrainte, cela fonctionne aussi – tehnodrom

Répondre

1

Vous avez deux clefs étrangères de votre table Prijave pointant vers votre table Studenti . MySQL ne joue pas bien avec ça.

Essayez cette

CONSTRAINT `FK_Prijave_Indeks` FOREIGN KEY (`Indeks`, `Upisan`) 
           REFERENCES `Studenti` (`Indeks`, `Upisan`), 

à la place de cela.

CONSTRAINT `FK_Prijave_Indeks` FOREIGN KEY (`Indeks`) REFERENCES `Studenti` (`Indeks`), /* wrong !*/ 
CONSTRAINT `FK_Prijave_Upisan` FOREIGN KEY (`Upisan`) REFERENCES `Studenti` (`Upisan`), 
+0

C'est tout. Je ne savais pas que cela devait être fait de cette façon. – tehnodrom