Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Indeks złożony dla tabeli relacji

Załóżmy, że trzymamy się automatycznego zwiększania id kolumna jako klucz podstawowy. Teraz musimy również upewnić się, że dane są spójne, tj. , nie ma zduplikowanych wierszy dla kombinacji (student_id, course_id) wartości. Tak więc, będziemy musieli albo obsłużyć to w kodzie aplikacji (wykonaj wybór za każdym razem przed wstawieniem/aktualizacją), albo możemy naprawić to strukturalnie, definiując Composite UNIQUE ograniczenie na (student_id, course_id) .

Teraz klucz podstawowy jest w zasadzie kluczem UNIQUE NOT NULL. Jeśli spojrzysz na definicję tabeli, to nowo zdefiniowane ograniczenie UNIQUE jest w zasadzie tylko kluczem podstawowym (ponieważ pola również NIE są NULL). Tak więc w tym konkretnym przypadku tak naprawdę nie musisz używać zastępczego klucza podstawowego id .

Różnica w narzutach podczas losowego DML (wstawianie/aktualizacja/usuwanie) będzie minimalna, ponieważ podobne narzuty będą również występowały w przypadku korzystania wyłącznie z indeksu UNIQUE. Możesz więc raczej zdefiniować naturalny podstawowy klucz złożony (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);

Powyższe wymusi również ograniczenie UNIQUE na kombinację (student_id, course_id) . Co więcej, zaoszczędzisz 4 bajty na wiersz (rozmiar int wynosi 4 bajty). Przyda się to, gdy będziesz mieć duże stoły.

Teraz, podczas dołączania od students do students_courses tabeli powyżej Klucz podstawowy będzie wystarczającym indeksem. Jeśli jednak chcesz dołączyć z courses do students_courses tabeli, do tego celu potrzebny będzie inny klucz. Możesz więc zdefiniować jeszcze jeden klucz w course_id w następujący sposób:

ALTER TABLE students_courses ADD INDEX (course_id);

Ponadto należy zdefiniować ograniczenia klucza obcego, aby zapewnić integralność danych:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupa MySQL według kolejnych wierszy

  2. Jak włączyć pamięć podręczną zapytań MySQL?

  3. mysqli_stmt_get_result alternatywa dla php 5.2.6

  4. Drugie zapytanie SELECT, jeśli pierwsze SELECT zwraca 0 wierszy

  5. Jak przekonwertować znacznik czasu na datę i godzinę w MySQL?