2013-08-11 3 views
1

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; 
+0

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. –

+0

Je suis d'accord avec vous, je vais essayer dans ce sens, merci! – Ravenskud

Répondre

0

Vous pouvez essayer quelque chose comme ceci: -

Add FOREIGN KEY (id_contig) REFERENCES conti2path(id_contig) 
0

Pour créer les clés étrangères: Vous avez besoin de deux références de contig2path à contig et le chemin respectivement. Vous pouvez créer ces clés en tant que tels:

ALTER TABLE contig2path ADD CONSTRAINT fkey1 FOREIGN KEY id_contig REFERENCES contig (id_contig); 
ALTER TABLE contig2path ADD CONSTRAINT fkey2 FOREIGN KEY id_path REFERENCES path (id_path); 

Pour créer la clé primaire dans contig2path, vous pouvez effectuer les opérations suivantes lors de la création de votre table:

create table contig2path (
..., 
PRIMARY KEY (id_contig, id_path) 
) 
Questions connexes