J'ai deux tables qui partagent plusieurs à-plusieurs, à savoir contig et chemin.Mysql - utiliser la clé primaire comme la clé étrangère
mysql> describe contig ;
+-------------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+----------------------+------+-----+---------+-------+
| id_contig | smallint(5) unsigned | NO | PRI | NULL | |
| length | smallint(5) unsigned | NO | | NULL | |
| total_rc | int(11) | NO | | NULL | |
| rc_es1 | smallint(6) | NO | | NULL | |
| rc_es2 | smallint(6) | NO | | NULL | |
| rc_ls1 | smallint(6) | NO | | NULL | |
| rc_ls2 | smallint(6) | NO | | NULL | |
| rpkm_es1 | float(10,2) | NO | | NULL | |
| rpkm_es2 | float(10,2) | NO | | NULL | |
| rpkm_ls1 | float(10,2) | NO | | NULL | |
| rpkm_ls2 | float(10,2) | NO | | NULL | |
| hit_id_nr | varchar(50) | YES | | NULL | |
| hit_id_tair | varchar(50) | YES | | NULL | |
| hit_id_uniprot | varchar(50) | YES | | NULL | |
| hit_desc_nr | text | YES | | NULL | |
| hit_desc_tair | text | YES | | NULL | |
| hit_desc_uniprot | text | YES | | NULL | |
| bayseq_likelihood | float(11,9) | YES | | NULL | |
| bayseq_fdr | float(11,9) | YES | | NULL | |
| deseq_fc | float(10,2) | YES | | NULL | |
| deseq_log2fc | float(10,2) | YES | | NULL | |
| deseq_pval | double | YES | | NULL | |
| deseq_padj | double | YES | | NULL | |
| edger_logconc | double | YES | | NULL | |
| edger_log2fc | double | YES | | NULL | |
| edger_pval | double | YES | | NULL | |
| edger_fdr | double | YES | | NULL | |
+-------------------+----------------------+------+-----+---------+-------+
et
mysql> describe path ;
+-----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+-------+
| id_path | tinyint(3) unsigned | NO | PRI | NULL | |
| path_name | text | NO | | NULL | |
| path_nseq | smallint(5) unsigned | NO | | NULL | |
| path_map | varchar(8) | NO | | NULL | |
| path_pix | varchar(28) | NO | | NULL | |
+-----------+----------------------+------+-----+---------+-------+
Pour les relier, je créé une "table croisée", à savoir contig2path:
mysql> describe contig2path ;
+-----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+-------+
| id_contig | smallint(5) unsigned | NO | PRI | NULL | |
| id_path | tinyint(3) unsigned | NO | PRI | NULL | |
+-----------+----------------------+------+-----+---------+-------+
Comme vous l'imaginez sans doute, je voudrais utiliser contig2path pour lier les données des tables contig et chemin. Mais avant d'utiliser JOIN, je dois lier des tables avec des clés étrangères. Ma question est: comment puis-je faire les clés primaires pour être aussi des clés étrangères?
Edit: vous pouvez avoir l'utilisation de la façon dont les tableaux ont été créés:
contig:
CREATE DATABASE IF NOT EXISTS `nutsedge` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `nutsedge` ;
-- -----------------------------------------------------
-- Table `nutsedge`.`contig`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `nutsedge`.`contig` ;
CREATE TABLE IF NOT EXISTS `nutsedge`.`contig` (
`id_contig` SMALLINT UNSIGNED NOT NULL ,
`length` SMALLINT UNSIGNED NOT NULL ,
`total_rc` INT NOT NULL ,
`rc_es1` SMALLINT NOT NULL ,
`rc_es2` SMALLINT NOT NULL ,
`rc_ls1` SMALLINT NOT NULL ,
`rc_ls2` SMALLINT NOT NULL ,
`rpkm_es1` FLOAT (10,2) NOT NULL ,
`rpkm_es2` FLOAT (10,2) NOT NULL ,
`rpkm_ls1` FLOAT (10,2) NOT NULL ,
`rpkm_ls2` FLOAT (10,2) NOT NULL ,
`hit_id_nr` VARCHAR(50) NULL ,
`hit_id_tair` VARCHAR(50) NULL ,
`hit_id_uniprot` VARCHAR(50) NULL ,
`hit_desc_nr` TEXT NULL ,
`hit_desc_tair` TEXT NULL ,
`hit_desc_uniprot` TEXT NULL ,
`bayseq_likelihood` FLOAT (11,9) NULL ,
`bayseq_fdr` FLOAT (11,9) NULL ,
`deseq_fc` FLOAT (10,2) NULL ,
`deseq_log2fc` FLOAT (10,2) NULL,
`deseq_pval` DOUBLE NULL,
`deseq_padj` DOUBLE NULL,
`edger_logconc` DOUBLE NULL,
`edger_log2fc` DOUBLE NULL,
`edger_pval` DOUBLE NULL,
`edger_fdr` DOUBLE NULL,
PRIMARY KEY (`id_contig`))
ENGINE = InnoDB;
SELECT 'NUTSEDGE DATABASE CREATED';
SHOW warnings;
chemin :
-- -----------------------------------------------------
-- Table `nutsedge`.`path`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `nutsedge`.`path` ;
CREATE TABLE IF NOT EXISTS `nutsedge`.`path` (
`id_path` TINYINT UNSIGNED NOT NULL ,
`path_name` TEXT NOT NULL ,
`path_nseq` SMALLINT UNSIGNED NOT NULL ,
`path_map` VARCHAR(8) NOT NULL,
`path_pix` VARCHAR(28) NOT NULL,
PRIMARY KEY (`id_path`))
ENGINE = InnoDB;
SELECT 'PATHWAY TABLE CREATED';
SHOW warnings;
contig2path:
-- -----------------------------------------------------
-- Table `nutsedge`.`contig2path`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `nutsedge`.`contig2path` ;
CREATE TABLE IF NOT EXISTS `nutsedge`.`contig2path` (
`id_contig` SMALLINT UNSIGNED NOT NULL ,
`id_path` TINYINT UNSIGNED NOT NULL ,
PRIMARY KEY (`id_contig`,`id_path`))
ENGINE = InnoDB;
SELECT 'CONTIG2PATHWAY TABLE CREATED';
SHOW warnings;
Pourquoi voudriez-vous qu'ils soient clés primaires la table de liens, esp. un composite? Pour moi, il serait plus judicieux de supprimer la clé primaire et de les rendre toutes les deux clés étrangères (puisqu'elles sont toutes deux simplement des références) et, si nécessaire, d'y ajouter un index unique pour éviter les doublons. –
Je suis d'accord avec vous, je vais essayer dans ce sens, merci! – Ravenskud