sql >> Database >  >> RDS >> Mysql

Samengestelde index voor een relatietabel

Laten we zeggen dat we vasthouden aan het gebruik van de Auto Increment id kolom als primaire sleutel. Nu moeten we er ook voor zorgen dat de gegevens consistent zijn, d.w.z. , er zijn geen dubbele rijen voor een combinatie van (student_id, course_id) waarden. We zullen dit dus ofwel in applicatiecode moeten verwerken (elke keer selecteren voor het invoegen/updaten), of we kunnen dit structureel oplossen door een Composite UNIQUE te definiëren beperking op (student_id, course_id) .

Nu is een primaire sleutel in feite een UNIEKE NIET NULL-sleutel. Als u naar uw tabeldefinitie kijkt, is deze nieuw gedefinieerde UNIEKE beperking in feite alleen een primaire sleutel (omdat de velden ook NIET NULL zijn). Dus in dit specifieke geval hoeft u niet echt een surrogaat primaire sleutel id te gebruiken .

Het verschil in overhead tijdens willekeurige DML (Insert/Update/Delete) zal minimaal zijn, aangezien u vergelijkbare overheadkosten zou hebben als u alleen een UNIEKE index gebruikt. U kunt dus liever een natuurlijke primaire samengestelde sleutel definiëren (student_id, course_id) :

-- Drop the id column
ALTER TABLE students_courses DROP COLUMN id;

-- Add the composite Primary Key
ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);

Hierboven wordt ook de UNIEKE beperking afgedwongen op de combinatie van (student_id, course_id) . Bovendien bespaart u 4 bytes per rij (grootte van int is 4 bytes). Dit is handig als je grote tafels hebt.

Nu, terwijl je meedoet van students naar students_courses tabel, boven de primaire sleutel is een voldoende index. Als u echter moet deelnemen aan courses naar students_courses table heeft u hiervoor een andere sleutel nodig. U kunt dus nog een sleutel definiëren op course_id als volgt:

ALTER TABLE students_courses ADD INDEX (course_id);

Bovendien moet u beperkingen voor externe sleutels definiëren om de gegevensintegriteit te waarborgen:

ALTER TABLE students_courses ADD FOREIGN KEY (student_id) 
                             REFERENCES students(student_id);

ALTER TABLE students_courses ADD FOREIGN KEY (course_id) 
                             REFERENCES courses(course_id);



  1. Oorzaken van MySQL-fout 2014 Kan geen query's uitvoeren terwijl andere niet-gebufferde query's actief zijn

  2. Ongeldige algemene gebruikers- of rolnaam

  3. Hoe de bytegrootte van de resultatenset in een SQL-query te krijgen?

  4. Is het mogelijk om uit meerdere tabellen in dezelfde SQL-instructie te verwijderen?