Bonjour à tous,
Depuis ce matin je m'arrache les cheveux sur le problème suivant :
J'ai 2 Tables :
La première collecte les données des charges d'un site client, comprendre Charge au sens comptable. Voici sa DDL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 CREATE TABLE `cus_sit_cha` (
	`cus_sit_ide` VARCHAR(45) NOT NULL COMMENT 'Identifiant du site client',
	`cus_ide` INT(11) NOT NULL COMMENT 'Identifiant du client',
	...
	`cus_sit_cha_des` VARCHAR(250) NOT NULL COMMENT 'Description de la charge',	`cat_ide` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Id. catalogue',
	...
        .....
	`cus_sit_cha_deb` DATE NOT NULL COMMENT 'Date de debut d\'utilisation de la charge ',
	`cus_sit_cha_fin` DATE NOT NULL COMMENT 'Date de fin d\'utilisation de la charge',
	`cus_sit_cha_ter` TINYINT(4) UNSIGNED NOT NULL DEFAULT '',
         ...
         ...
	`cus_sit_cha_per` TINYINT(4) UNSIGNED NOT NULL DEFAULT '',	
        PRIMARY KEY (`cus_sit_ide`, `cus_ide`, `cus_swi_ide`, `cat_ide`, `cus_sit_cha_deb`),
	INDEX `idx_sel_cha` (`cus_ide`),
	INDEX `cat_cus_sit_cha` (`cat_ide`),	CONSTRAINT `cat_cus_sit_cha` FOREIGN KEY (`cat_ide`) REFERENCES `cat` (`cat_ide`) ON UPDATE CASCADE,
	CONSTRAINT `cus_sit_cus_sit_cha` FOREIGN KEY (`cus_sit_ide`, `cus_ide`, `cus_swi_ide`) REFERENCES `cus_sit` (`cus_sit_ide`, `cus_ide`, `cus_swi_ide`) ON UPDATE CASCADE)
COMMENT='Charges rattachées au site géographique du client'
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Celle-ci est reliée à sa table correspondante pour gérer les charges par des devis. Voici sa DDL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 CREATE TABLE `cus_sit_cha_devis` (
	`cus_sit_ide` VARCHAR(45) NOT NULL COMMENT 'Identifiant du site client',
	`cus_ide` INT(11) NOT NULL COMMENT 'Identifiant du client',
	`cat_ide` VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'Id. catalogue',
	`cha_deb` DATE NOT NULL COMMENT 'Date de debut d\'utilisation de la charge ',
	`cus_sit_ide_devis` VARCHAR(45) NOT NULL,
	...
	`author_ide` INT(11) NOT NULL,
	PRIMARY KEY  (`cus_ide`, `cus_sit_ide`, `cat_ide`, `cha_deb`),
	CONSTRAINT `cus_sit_cha_devis_author_fk_cus` FOREIGN KEY (`author_ide`) REFERENCES `cus` (`cus_ide`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Au passage, vous aurez compris qu'il y a des champs clé primaire composites. La réflexion est la suivante : une charge d'un site client peut passer par un devis donc dans ce cas, l'ID de la charge est recopié dans la table des devis. Mais il se peut que la charge soit facturée directement, donc elle ne sera pas recopiée dans la table correspondante. IL ME FAUT DONC UNE RELATION DE 1 , 1 à 0 , 1 !!!
Je veux relier ces 2 deux tables par une relation de (de cus_sit_cha)1,1 ==> (vers cus_sit_cha_devis) 0,1

Et depuis ce matin j'essaie de créer la contrainte suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
ALTER TABLE `cus_sit_cha_devis`
	ADD CONSTRAINT `cus_sit_cha_cus_sit_cha_devis` 
	FOREIGN KEY (`cus_sit_ide`, `cus_ide`,  `cat_ide`, `cha_deb`)
	REFERENCES `cus_sit_cha` (`cus_sit_ide`, `cus_ide`,  `cat_ide`, `cus_sit_cha_deb`)
	ON UPDATE CASCADE 
	ON DELETE CASCADE;
Mais à l'exécution de cette requête, j'ai le warning suivant qui s'affiche :
"Warning"
"150"
"Alter table '`Mydatabase`.`cus_sit_cha_devis`' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns near ' FOREIGN KEY (`cus_sit_ide`, `cus_ide`, `cat_ide`, `cha_deb`) REFERENCES `cus_sit_cha` (`cus_sit_ide`, `cus_ide`, `cat_ide`, `cus_sit_cha_deb`)'.

Pour information, je suis sous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
10.2.10-MariaDB-10.2.10+maria~jessie
Comment faire aboutir la créatoin de cette relation ?

Merci à tous ceux qui se pencheront sur mon problème.