sql >> Database teknologi >  >> RDS >> Mysql

MySQL:Forståelse af kortlægningstabeller

Når du bruger mange-til-mange relationer, er den eneste realistiske måde at håndtere dette på med en kortlægningstabel.

Lad os sige, at vi har en skole med lærere og elever, en elev kan have flere lærere og omvendt.

Så vi laver 3 borde

elev-id usigneret heltal auto_increment primærnøglenavn varcharteacher-id usigneret heltal auto_increment primærnøglenavn varcharlink_st elev_id heltal ikke null lærer_id heltal ikke null primærnøgle (student_id, lærer_id) 

Elevtabellen vil have 1000 poster
Lærertabellen vil have 20 poster
Link_st-tabellen vil have lige så mange poster, som der er links (IKKE 20x1000, men kun for de faktiske links).

Udvalg
Du vælger f.eks. elever pr. lærer ved hjælp af:

VÆLG s.navn, t.navn FRA studentINNER JOIN link_st l ON (l.student_id =s.id) <--- link først elev til link-tabellenINNER JOIN lærer t ON (l.teacher_id =t.id) <--- link derefter læreren til linktabellen. BESTIL EFTER t.id, s.id

Normalt skal du altid bruge en inner join her.

Sådan laver du et link
Når du tildeler en lærer til en elev (eller omvendt, det er det samme) .Du skal kun gøre:

INSERT INTO link_st (student_id, teacher_id) SELECT s.id, t.id FROM elev s INNER JOIN lærer t ON (t.name ='Jones') HVOR s.name ='kiddo' 

Dette er lidt misbrug af en indre joinforbindelse, men det virker, så længe navnene er unikke.
Hvis du kender id'erne, kan du selvfølgelig bare indsætte dem direkte.
Hvis navnene er ikke unikt, dette vil være en fejl og bør ikke bruges.

Sådan undgår du duplikerede links
Det er meget vigtigt at undgå duplikerede links, alle mulige dårlige ting vil ske, hvis du har dem.
Hvis du vil forhindre indsættelse af duplikerede links til din linktabel, kan du erklære en unik indeks på linket (anbefales)

ÆNDRINGSTABEL link_st TILFØJ UNIKT INDEX s_t (elev_id, lærer_id);  

Eller du kan tjekke indsætningserklæringen (ikke rigtig anbefalet, men det virker).

INSERT INTO link_st (elev_id, lærer_id) VÆLG s.id, t.id FRA elev s INNER JOIN lærer t ON (t.id =548) LEFT JOIN link_st l ON (l.student_id =s.id OG l.teacher_id =t.id) WHERE (s.id =785) OG (l.id ER NULL) 

Dette vil kun vælge 548, 785 hvis at data ikke allerede er i link_st tabel, og vil ikke returnere noget, hvis disse data allerede er i link_st. Så det vil nægte at indsætte duplikerede værdier.

Hvis du har en bordskole, afhænger det af, om en elev kan tilmeldes flere skoler (usandsynligt, men lad os antage), og lærere kan tilmeldes flere skoler. Meget muligt.

tabel skole-id usigneret heltal auto_increment primærnøglenavn varchartable school_members id usigneret heltal auto_increment primærnøgle skole_id heltal ikke null member_id heltal ikke null is_elev boolean ikke null 

Du kan liste alle elever på en skole som sådan:

SELECT s.nameFROM school iINNER JOIN school_members m ON (i.id =m.school_id)INNER JOIN elev s ON (s.id =m.member_id AND m.is_student =true) 


  1. PostgreSQL hvordan man kan se hvilke forespørgsler der er kørt

  2. Liste over alle databaser fra en sammenkædet server i SQL Server (T-SQL-eksempler)

  3. Hvorfor vælger nogle mysql-forbindelser gamle data i mysql-databasen efter en delete + insert?

  4. Fjernelse af duplikerede rækker fra en tabel