Partage
  • Partager sur Facebook
  • Partager sur Twitter

MySql Erreur 1075 création de table

Clés étrangères, auto increment, clé primaires

Sujet résolu
19 novembre 2020 à 12:08:19

Bonjour à tous,

Merci de me lire et d'apporter votre aide.

je viens de me remettre sur un vieux projet de création de base de données et je bute sur un problèmes.

Lors de la création de mes tables je me suis retrouvé avec des liens de plusieurs à plusieurs, j'ai donc créé des tables intermédiaires avec des clefs étrangères.

J'ai donc un table talent (une personne) et une table compétence. Une compétence peut être affectée à plusieurs personnes et une personne peut avoir plusieurs compétences.

J'ai donc créé la table experience_competence qui va associer mes talents et mes compétences.

voilà ce que je voudrais faire :

CREATE TABLE IF NOT EXISTS `MatchMaker`.`experience_competence` (
  `idexperience_competence` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `talent_id` INT UNSIGNED NOT NULL,
  `competence_id` INT UNSIGNED NOT NULL,
  `mois` SMALLINT(255) UNSIGNED NOT NULL,
  `maitrise` CHAR(1) NULL COMMENT 'note 0 à 5',
  INDEX `fk_talent_id_idx` (`talent_id` ASC) VISIBLE,
  INDEX `fk_competence_id_idx` (`competence_id` ASC) VISIBLE,
  PRIMARY KEY (`talent_id`, `competence_id`),
  CONSTRAINT `fk_talent_id`
    FOREIGN KEY (`talent_id`)
    REFERENCES `MatchMaker`.`talent` (`idtalent`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_competence_id`
    FOREIGN KEY (`competence_id`)
    REFERENCES `MatchMaker`.`competence` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

1: J'ai alors un message d'erreur "Error Code: 1075. Incorrect table definition; there can be only one auto column and it must be defined as a key

". Je voudrais que idexperience_competence s'auto incrémente, et j'imagine que ma clef primaire doit être talent_id et competence_id mais j'ai peur d'avoir loupé une notion sur les clefs primaires, clés étrangères et index. J'ai relu le cours plusieurs fois mais j'avoue ne pas saisir mon erreur.

2: j'ai un message d'erreur lors de l'intégration (j'utilise MySql workbench), il m'ajoute VISIBLE après mes index, je dois retirer cette mention pour qu'il veuille bien retirer la notion d'erreur, si quelqu'un peut m'expliquer la cause je suis preneur.

Merci infiniment de votre aide.

Bonne journée

Olivier

-
Edité par moseroliv 19 novembre 2020 à 12:08:55

  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2020 à 12:49:45

il faut un ajouter un KEY(`idexperience_competence`) comme demandé dans le message d'erreur "tout simplement"
  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2020 à 13:17:20

Bonjour,

moseroliv a écrit:

J'ai donc un table talent (une personne) et une table compétence. Une compétence peut être affectée à plusieurs personnes et une personne peut avoir plusieurs compétences.

J'ai donc créé la table experience_competence qui va associer mes talents et mes compétences.

Cela s'appelle un table de relation, et non une table d'entité. Cette table de relation ne devrait tout simplement pas posséder d'id auto incrémentée (cf. MERISE, la lecture du document "Conception BDD" via ma signature peut t'aider ;) ) sauf si réellement besoin d'un identifiant relatif mais cela m'étonnerait dans ce contexte ...

En toute rigueur ton modèle devrait être :

-- Table entité talent
CREATE TABLE talent (
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	...
	PRIMARY KEY ( id )
) ENGINE = InnoDB;

-- Table entité compétence
CREATE TABLE competence (
	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
	...
	PRIMARY KEY ( id )
) ENGINE = InnoDB;

-- table de relation
CREATE TABLE experience_competence (
	talent_id INT UNSIGNED NOT NULL,
	competence_id INT UNSIGNED NOT NULL,
	mois TINYINT UNSIGNED NOT NULL,
	annee TINYINT UNSIGNED NOT NULL,
	maitrise TINYINT UNSIGNED NULL,
	PRIMARY KEY ( talent_id, competence_id ),
	INDEX fk_talent_id_idx ( talent_id ASC ) VISIBLE,
	INDEX fk_competence_id_idx ( competence_id ASC ) VISIBLE,
	CONSTRAINT fk_talent_id
		FOREIGN KEY ( talent_id )
		REFERENCES talent ( id )
		ON DELETE CASCADE,
	CONSTRAINT fk_competence_id
		FOREIGN KEY ( competence_id )
		REFERENCES competence ( id )
		ON DELETE CASCADE
) ENGINE = InnoDB;

J'ai viré les options de clé étrangère NO ACTION, par défaut MySQL met RESTRICT c'est plutôt mieux pour l'intégrité de tes données. Mais tu pourrais mettre ON DELETE CASCADE, ce qui permettrait d'autoriser la suppression d'un talent ou d'une compétence et supprimerait en cascade les relations associées ...

J'ai aussi passé la colonne maîtrise en TINYINT UNSIGNED si cette colonne est destinée à recevoir un entier positif de 0 à 5 ... pareil pour le mois (en fait je ne sais pas ce que tu veux y stoker), et pas besoin de l'année également ?

-
Edité par Benzouye 19 novembre 2020 à 13:22:17

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
19 novembre 2020 à 15:08:13

Roooh ben ça c'est très gentil, merci! Je vais lire avec grande attention Conception BDD :-)

Malgré tout j'ai encore une erreur.

J'ai repris ton code et je l'ai adapté:

CREATE TABLE experience_competence (
    talent_id INT UNSIGNED NOT NULL,
    competence_id INT UNSIGNED NOT NULL,
    mois TINYINT UNSIGNED NOT NULL,
    annee TINYINT UNSIGNED NOT NULL,
    maitrise TINYINT UNSIGNED NULL,
    PRIMARY KEY ( talent_id, competence_id ),
    INDEX fk_talent_id_idx (talent_id ASC),
    INDEX fk_competence_id_idx (competence_id ASC),
    CONSTRAINT fk_talent_id
        FOREIGN KEY ( talent_id )
        REFERENCES talent ( idtalent )
        ON DELETE CASCADE,
    CONSTRAINT fk_competence_id
        FOREIGN KEY ( competence_id )
        REFERENCES competence ( id )
        ON DELETE CASCADE
) ENGINE = InnoDB

J'ai enlevé les "Visible" qui semble poser problème sur ma version (5.7.3), et j'ai adapté pour avoir le bon nom de champs de la table talent. or lorsque j'execute cela, il me renvoie "#1022 - Can't write; duplicate key in table 'experience_competence'".

Merci encore

Olivier

EDIT Benzouye : Coloration syntaxique SQL ;)

-
Edité par Benzouye 19 novembre 2020 à 16:51:16

  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2020 à 15:57:00

il se pourrait que le nom de tes contraintes soient déjà créés/utilisés dans la base
  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2020 à 16:58:49

moseroliv a écrit:

il me renvoie "#1022 - Can't write; duplicate key in table 'experience_competence'".

C'est au moment où tu lances le CREATE TABLE experience_competence que tu as cette erreur ?

L'erreur impliquerait que la table existe et qu'il y a dedans déjà des données, et que dans ces données il y a des doublons, des couples talent/compétence qui se répètent, ce qui est interdit par la clé primaire composée ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
20 novembre 2020 à 9:43:42

Bonjour,

Merci et désolé pour mon délai de réponse.

Voici un capture d'écran de la base si cela peut aider.

Il n'y a pas de table existante. 

Merci

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2020 à 9:52:00

ça pue le bug PHPMyAdmin ...

Que se passe-t-il si tu enlève les FK :

CREATE TABLE experience_competence (
    talent_id INT UNSIGNED NOT NULL,
    competence_id INT UNSIGNED NOT NULL,
    mois TINYINT UNSIGNED NOT NULL,
    annee TINYINT UNSIGNED NOT NULL,
    maitrise TINYINT UNSIGNED NULL,
    PRIMARY KEY ( talent_id, competence_id ),
    INDEX fk_talent_id_idx (talent_id),
    INDEX fk_competence_id_idx (competence_id)
) ENGINE = InnoDB;

Et que tu les rajoutes après :

ALTER TABLE experience_competence
    ADD CONSTRAINT fk_talent_id
        FOREIGN KEY ( talent_id )
        REFERENCES talent ( idtalent )
        ON DELETE CASCADE,
    ADD CONSTRAINT fk_competence_id
        FOREIGN KEY ( competence_id )
        REFERENCES competence ( id )
        ON DELETE CASCADE;

-
Edité par Benzouye 20 novembre 2020 à 9:53:01

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
20 novembre 2020 à 15:15:27

Edit:

J'ai trouvé j'avais un champs d'une autre table qui avait le même nom talent_id. j'ai changé le nom et c'est passé.

Erreur de débutant pardon 😒

Merci

Alors j'ai un peu galère, donc j'ai tout redémarré et j'ai procédé en 3 phases:

Ajout de ton premier code

Ajout de ton second code ==> erreur duplicate Key

J'ai retiré la première partie fk_talent_id ==> Ok

ce qui est bizarre c'est que si je regarde sur l'image ci-dessous j'ai l'impression que la contrainte est créée non?

edit: non c'est l'index qui est créé

Merci beaucoup en tout cas et pour ton aide et encore plus pour ta réactivité (plus que la mienne...).

Olivier

-
Edité par moseroliv 20 novembre 2020 à 15:25:31

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2020 à 15:24:54

regarde si dans une autre table qui a talent_id en clé externe, si le nom fk_talent_id n'existe pas déjà

-
Edité par umfred 20 novembre 2020 à 15:25:04

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2020 à 15:36:41

Bonjour,

J'ai trouvé j'avais un champs d'une autre table qui avait le même nom talent_id. j'ai changé le nom et c'est passé.

Erreur de débutant pardon 😒

Merci

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2020 à 21:15:28 - Message modéré pour le motif suivant : Toute forme de publicité est interdite


24 novembre 2020 à 12:24:11

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL