2017-04-14 6 views
0

와 테이블을 만들 필요가 SQL에서 두 가지 기본 키를 사용하여 테이블을 만들 필요가 인스턴트 메시징과 정말 도움이 필요 인스턴트 메신저!두 개의 기본 키 (SQL)

어쨌든 여기에 내 테이블이 있습니다.

mysql> create table participant(
    -> participantid int not null primary key, 
    -> participant_fname varchar(20) not null, 
    -> participant_lname varchar(20) not null); 


    mysql> create table event(
    -> event_id int not null primary key, 
    -> event_name varchar(35) not null, 
    -> event_date int not null); 

그래서 그 내 두 개의 테이블은 어떻게 든 병합 및 기본 키와 같은 (EVENT_ID 및 participantid)와 eventparticipant라는 테이블을 만들 필요가 있는가? 어떤 생각 이니?

감사합니다.

+0

: 은 그래서, 당신의 테이블에 의해 정의됩니다. 관련없는 태그를 사용하지 마십시오. –

+0

복합 키를 찾고 있습니다. 다음은 도움이 될 질문입니다. http://stackoverflow.com/q/5835978/3901060 – FamousJameous

답변

3

두 테이블 사이에 m : n 관계를 작성하려고하고 eventparticipant 테이블이 junction 테이블의 역할을한다고 가정합니다.

이 새 테이블에는 participant_idevent_id 두 개의 열로 구성된 기본 키가 하나만 있습니다. 테이블에는 기본 키가 하나만있을 수 있지만이 기본 키는 여러 개의 열로 구성 될 수 있습니다. 이 열 값의 각 조합은 고유해야합니다.

CREATE TABLE eventparticipant(
    participant_id int not null, 
    event_id int not null, 
    PRIMARY KEY (participant_id, event_id) 
); 

ALTER TABLE participant 
ADD CONSTRAINT fk_participant_eventpart 
FOREIGN KEY(participant_id) 
REFERENCES eventparticipant(participant_id) 
ON DELETE CASCADE; 

ALTER TABLE event 
ADD CONSTRAINT fk_event_eventpart 
FOREIGN KEY(event_id) 
REFERENCES eventparticipant(evet_id) 
ON DELETE CASCADE; 

ON DELETE CASCADE 절은 선택 사항입니다. 이는 참여자 또는 이벤트를 h 제하면 둘 사이의 junction이 자동으로 h 제됨을의 L합니다. 반면에이 절을 추가하지 않으면 관련된 모든 eventparticipant 레코드를 먼저 삭제하지 않으면 참가자 또는 이벤트를 삭제할 수 없습니다.

당신이이 외래 키 제약 조건을 만들지 않은 경우,이 아이디의이 participant 또는 event에 존재하지 않는로 테이블 eventparticipant에 레코드를 추가 할 수있을 것입니다 그리고 당신은 또한 참가자 또는 이벤트를 삭제 한 뒤에 eventparticipant에서 고스트 기록을 남길 수 있습니다. 이 두 테이블을 병합에 당신이 정말로 이러한 세 개의 테이블에 병합 뷰 또는 단지 선택 쿼리를 대신 물리적으로 이렇게 생성하지 않는, 원하는 경우


SELECT 
    p.participant_fname, 
    p.participant_lname, 
    e.event_name, 
    e.event_date 
FROM 
    participants p 
    INNER JOIN eventparticipant ep 
     ON p.participant_id = ep.participant_id 
    INNER JOIN event e 
     ON ep.event_id = e.event_id; 

참고 : 병합 된 테이블을 만드는 것은 정규화되지 않은 데이터가 있음을 의미합니다. 동일한 데이터의 여러 사본을 보관해야하기 때문에 이것은 나쁩니다. 이벤트의 각 참가자에 대해 이벤트 이름과 날짜를 다시 입력해야합니다. 따라서 데이터를 유지 관리하고 일관성있게 유지하기가 어렵습니다. 예를 들어, 이벤트 날짜가 변경되면 모든 참여자를 위해 이벤트 날짜를 업데이트하는 것을 잊거나 어딘가에 잘못 입력하는 경우가 발생할 수 있습니다.

0

테이블에 기본 키가 두 개있을 수 없습니다. 또한, 당신은 정말 그 테이블을 결합하고 싶지 않아? 좋은 디자인은 참가자와 이벤트를위한 별도의 테이블을 가질 것입니다. 참여자 테이블에는 이벤트에 대한 외부 키가있는 열이 있거나 참여자가 여러 이벤트를 가질 수있는 경우 이벤트 W 참여자를 링크하는 다른 테이블을 작성합니다. IOW, 다 대다 관계.

따라서 디자인 관점에서 볼 때 참여자가 둘 이상의 이벤트를 가질 수 있는지를 결정해야합니다.

0

복합 키 두 개 이상의 열로 이루어진 키입니다.이 질문은 mysql` '에 관한 한, 나는`SQL-server` 태그를 제거

create table eventparticipant(
    event_id int not null, 
    participant_id int not null, 
    PRIMARY KEY (participant_id, event_id) 
);