2017-04-14 2 views
0

Ich muss eine Tabelle mit zwei Primärschlüsseln in SQL erstellen, bin neu im Coding und brauche wirklich Hilfe im so verwirrt!Ich brauche eine Tabelle mit zwei Primärschlüsseln (SQL)

sowieso hier sind meine Tabellen, die ich habe.

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

so das sind meine beiden Tabellen, ich brauche sie irgendwie zu verschmelzen und eine Tabelle namens eventparticipant mit (event_id und participantId) als Primärschlüssel machen? irgendeine Idee wie bitte?

danke!

+0

I 'sql-server' Tag entfernt, da diese Frage zu' mysql' ist. Bitte verwenden Sie keine nicht verwandten Tags. –

+0

Sie suchen nach einem zusammengesetzten Schlüssel. Hier ist eine Frage, die helfen kann: http://stackoverflow.com/q/5835978/3901060 – FamousJameous

Antwort

3

Ich nehme an, dass Sie versuchen, eine m: n-Beziehung zwischen den beiden Tabellen zu erstellen, und dass die Tabelle eventparticipant als Junction-Tabelle dient.

Diese neue Tabelle nur ein Primärschlüssel der participant_id und event_id zwei Spalten bestehend hat. Beachten Sie, dass eine Tabelle nur einen Primärschlüssel haben kann. Dieser Primärschlüssel kann jedoch aus mehreren Spalten bestehen. Jede Kombination der Werte dieser Spalten muss eindeutig sein.

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; 

Die Klausel ON DELETE CASCADE ist optional. Wenn Sie entweder einen Teilnehmer oder ein Ereignis löschen, wird die Verbindung zwischen beiden automatisch gelöscht. Wenn Sie diese Klausel jedoch nicht hinzufügen, können Sie keine Teilnehmer oder Ereignisse löschen, es sei denn, Sie löschen zuerst alle zugehörigen eventparticipant Datensätze.

Wenn Sie diese Fremdschlüssel-Constraints nicht erstellt haben, wäre es möglich, Datensätze in der Tabelle eventparticipant mit id bestehenden hinzufügen nicht in participant oder event und Sie könnten auch Teilnehmer oder Ereignisse löschen und Rück Aufzeichnungen in eventparticipant hinter sich lassen.


Wenn Sie wirklich wollen diese beiden Tabellen zusammenführen, tun dies nicht physisch tun, anstatt eine zusammenfassende Ansicht erstellen oder einfach nur eine Auswahlabfrage auf diesen drei Tabellen

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; 

Hinweis: Beim Erstellen einer zusammengeführten Tabelle werden nicht normalisierte Daten angezeigt. Das ist schlecht, weil Sie mehrere Kopien der gleichen Daten behalten müssen. Für jeden Teilnehmer eines Events müssten Sie die Namen und Daten des Events erneut eingeben. Dies macht es schwierig, die Daten zu pflegen und konsistent zu halten. Wenn sich beispielsweise das Ereignisdatum ändert, kann es passieren, dass Sie vergessen, es für alle Teilnehmer zu aktualisieren oder dass Sie es irgendwo falsch eingeben.

0

Sie können nicht zwei Primärschlüssel in einer Tabelle haben. Außerdem wollen Sie diese Tabellen nicht wirklich kombinieren, oder? Gutes Design hätte separate Tische für Teilnehmer und Veranstaltungen. Die Teilnehmertabelle könnte eine Spalte mit einem Fremdschlüssel für das Ereignis haben oder, wenn ein Teilnehmer mehrere Ereignisse haben könnte, würden Sie eine weitere Tabelle erstellen, um Ereignisse und Teilnehmer zu verknüpfen. IOW, eine viel zu viele Beziehung.

Aus einer Entwurfsperspektive müssen Sie also feststellen, ob Teilnehmer mehr als ein Ereignis haben können.

0

Was Sie suchen, ist Composite-Schlüssel, die ein Schlüssel aus zwei oder mehr Spalten ist. So wird Ihre Tabelle definiert:

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