2013-08-11 5 views
1

many-to-many 관계, 즉 contig경로을 공유하는 두 개의 테이블이 있습니다. 당신은 아마 상상Mysql - 외래 키로 기본 키 사용

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

것은, 내가 좋아하는 것까지 :

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

하고 연결하기 위해

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

, 나는 "크로스 테이블", 즉 contig2path을 생성 contig2path을 사용하여 표의 데이터를 연결하십시오. contig경로. 하지만 JOIN을 사용하기 전에 테이블을 외래 키와 연결해야합니다.

-> contig.id_contig would be linked to conti2path.id_contig 
-> path.id_path would be linked to contig2path.id_path 

내 질문은 : 기본 키를 외래 키로 만들려면 어떻게해야합니까?

편집 :

인접 :

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; 

경로 :

-- ----------------------------------------------------- 
-- 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 :

,369 당신은 테이블이 생성 된 방법을 사용할 수있다
-- ----------------------------------------------------- 
-- 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

당신이 그들에 기본 키가되고 싶어요 것입니다 왜 링크 테이블, 특히 복합 재료? 나에게 기본 키를 제거하고 둘 다 외래 키로 만드는 것이 더 바람직하다. (둘 모두 참조이기 때문에) 필요하다면 대신 고유 인덱스를 추가하여 중복을 피할 수있다. –

+0

나는 너에게 동의한다, 나는 그 의미에서 시도 할 것이다, 고마워! – Ravenskud

답변

0

당신이 뭔가를 시도 할 수 있습니다 : -

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

외부 키 만들려면 : 당신은 각각 인접하고 경로 contig2path에서 두 개의 참조가 필요합니다. 당신과 같은 그 키를 만들 수 있습니다

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); 

가 contig2path의 기본 키를 만들려면 테이블을 만들 때 다음과 같은 작업을 수행 할 수

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