2011-11-28 2 views
1

솔직히 말해서, 기본 키와 외래 키 작동 방식에 다소 흐릿합니다. 나는 여기에 누군가에 의해 내 데이터베이스를 설치하라는 말을 들었다. 나는 7 개의 테이블, 하나는 조직을위한 테이블, 다른 하나는 범주, 서비스 및 문화권, 그리고 조직과 조직 사이의 3 개의 상호 참조 테이블과 다른.여러 개의 기본/외래 키

예를 들어 org_culture_xref 테이블을 가져옵니다. 나는 두 개의 컬럼을 가지고 있는데, 하나는 org_id이다. 이것은 조직 테이블의 org_id 컬럼 (기본 키)과 같다. 다른 하나는 cult_id입니다. culture_id는 culture 테이블의 cult_id 열 (기본 키)과 같습니다.

org_culture_xref 테이블의 두 열이 모두 기본 키와 외래 키라고 생각합니다. 그러나이 두 열에 대해 여러 값을 가질 수있는 것 같지 않습니다. 저는 모든 조직이 여러 문화와 관련 될 수 있고 모든 문화가 여러 조직과 연관 될 수 있기 때문에 조직과 문화간에 여러 관계를 유지할 수 있기를 원합니다.

두 열에 대해 여러 값을 가질 수 있도록하려면 어떻게해야합니까?

답변

1

상호 참조 테이블의 기본 키는 두 열 모두입니다. 즉, 두 ID의 조합이 고유해야하지만 어느 열에서도 개별 ID의 반복을 가질 수 있습니다. 여기

는 테이블 작성하는 성명 : (전부는 아니지만) 관계형 데이터베이스를

CREATE TABLE `x` (
    `a_id` varchar(6) NOT NULL default '', 
    `b_id` varchar(6) NOT NULL default '', 
    PRIMARY KEY (`a_id`,`b_id`) 
) 

문제 자체 다 대다 관계를 대부분 적용되는 크로스 심판 테이블 접근 방식을하지만, 이후 나는 대략 10 년 안에 mysql을 사용하지 않았다. here에서이 코드를 얻었는데,이 코드는 mysql 특정 코드가있는 주제에 대한 자세한 설명이있는 것으로 보인다.

+0

내가이 작업을 시도 할 때마다 이전 ID를 대체하는 것으로 보입니다. 왜 이럴 수 있니? –

+0

@JakeSmith 죄송합니다 - 내가 말했듯이, 내 mysql은 매우 쓸모가 없기 때문에 내가 만든 테이블 문을 넘어 기본 키를 생성하는 세부 사항을 안내 할 수는 없습니다. –

+0

@JakeSmith 외래 키 정의가 포함되어 있지 않기 때문에 이미 테이블이 생성되어 있다면 CREATE TABLE 문을 사용하고 싶지 않습니다. 올바르게 기억한다면'ALTER TABLE' 문을 사용하고 싶을 것이다. –

1

org_culture_xref의 각 열은 외부 키는 다음 org_idorganization에 외부 키이며,는 cult_idculture에 외래 키이다. 그중 두 개가 이 모두 org_culture_xref의 기본 키입니다.

그래서,이 라인을 따라 뭔가 :

CREATE TABLE org_culture_xref 
(
    org_id NUMERIC(10) NOT NULL, 
    cult_id NUMERIC(10) NOT NULL, 
    PRIMARY KEY (org_id, cult_id), 
    FOREIGN KEY (org_id) REFERENCES organization (org_id), 
    FOREIGN KEY (cult_id) REFERENCES culture (cult_id) 
); 
+0

이전 테이블을 삭제하려고 할 때이 SQL 코드를 사용하면 테이블을 만들 수 없다는 오류 메시지가 표시됩니다. –

+0

@JakeSmith :'org_id'와'cult_id' **는 ** org' 테이블의'ord_id'와'cult' 테이블의'cult_id'와 같은 참조 형과 동일합니다 ** –

+1

@ JakeSmith : Idon 데이터베이스에 액세스 할 수 없으므로 명시 적으로 작성하지 않은 사항에 대해 추측 할 필요가 있습니다. 하나 이상의 추측이 잘못되면 오류 메시지가 표시됩니다. 네가 나에게 더 많은 정보를주지 않으면 내가 더 이상 도울 수 없어. 예를 들어, "테이블을 만들 수 없다는 오류 메시지"대신에 오류 메시지가 무엇인지 알려주지 마십시오. – ruakh

3

무슨 말을하는지 다 대다 관계이다. 상호 참조 테이블을 사용하여 올바른 경로에 있습니다.

외국 및 기본 키의 작동 방식을 검토하는 것이 좋습니다. 테이블 당 하나의 기본 키만있을 수 있지만 여러 개의 외래 키가있을 수 있습니다. 그러나 기본 키는 하나의 열로 제한 될 필요가 없습니다. 2 개, 3 개 또는 그 이상의 컬럼에 걸쳐있는 기본 키를 가질 수 있습니다.

여기 해결책은 각 열/테이블 관계에 대해 하나씩 두 개의 외래 키와 두 테이블에 걸쳐있는 한 개의 기본 키를 가지는 것입니다.

다음은 한 번에 사용한 테이블의 예입니다.이 테이블은 도시와 카운티를 다 대다 관계로 연결합니다.

mysql> show create table xref_cities_counties\G 
*************************** 1. row *************************** 
     Table: xref_cities_counties 
Create Table: CREATE TABLE `xref_cities_counties` (
    `city_id` int(10) unsigned NOT NULL, 
    `county_id` tinyint(3) unsigned NOT NULL, 
    PRIMARY KEY (`city_id`,`county_id`), 
    KEY `city_id` (`city_id`), 
    KEY `county_id` (`county_id`), 
    CONSTRAINT `fk_xrefcitiescounties_cityid` FOREIGN KEY (`city_id`) REFERENCES `florida_cities` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `fk_xrefcitiescounties_countyid` FOREIGN KEY (`county_id`) REFERENCES `florida_counties` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

mysql> 
mysql> 
mysql> describe xref_cities_counties; 
+-----------+---------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+---------------------+------+-----+---------+-------+ 
| city_id | int(10) unsigned | NO | PRI |   |  | 
| county_id | tinyint(3) unsigned | NO | PRI |   |  | 
+-----------+---------------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

mysql> 

주제에 대한 추가 읽기를 제안합니다. 니가 좋은 출발을하고있는 것 같아.

관련 문제