我在上面的評論中寫了很多,但讓我將它應用於實踐中的答案。我們將與您的表開始,然後添加兩個:
表:
CREATE TABLE students (
id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name char(20),
lastname char(20)
) ENGINE = INNODB;
CREATE TABLE subjects (
id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name char(20)
) ENGINE = INNODB;
CREATE TABLE student_subject (
student_id int(3) NOT NULL,
subject_id int(3) NOT NULL,
PRIMARY KEY(student_id, subject_id)
FOREIGN KEY(student_id) references students(id),
FOREIGN KEY(subject_id) references subjects(id)
) ENGINE = INNODB;
有了這樣的表的設置,就可以在同一個有多個數字auto_increment
主鍵列數據庫。在這種情況下,有兩個students.id
和subjects.id
。第三個表student_subject
顯示瞭如何將這些鏈接在一起,其中student_id
和subject_id
是該表的主鍵,但每個表也是其實體表的外鍵。
有了這樣的查詢設置變得簡單:
示例查詢:
/* Get All students */
SELECT
students.id,
students.name,
students.lastname
FROM students;
/* Get All Subjects */
SELECT
subjects.id,
subjects.name
FROM subjects;
/* Get all subjects for a particular student */
SELECT
subjects.name
FROM subjects
INNER JOIN student_subject ON subjects.id = student_subject.subject_id
INNER JOIN students ON student_subject.student_id = students.id
WHERE students.id = 1;
編輯:
下面是證明了三種表多到一些樣本數據 - 上述結構說明的多種概念:
/* Students Table */
+----+----------------+----------------+
| id | name | lastname |
+----+----------------+----------------+
| 1 | John | Doe |
|----|----------------|----------------|
| 2 | Joe | Bob |
+----+----------------+----------------+
/* Subjects Table */
+----+----------------+
| id | name |
+----+----------------+
| 1 | Calculus |
|----|----------------|
| 2 | Physics |
|----|----------------|
| 3 | Geography |
+----+----------------+
/* Student Subject Table */
+------------+------------+
| student_id | subject_id |
+------------+------------+
| 1 | 1 |
|------------|------------|
| 1 | 2 |
|------------|------------|
| 2 | 2 |
|------------|------------|
| 2 | 3 |
+------------+------------+
有了這個表格結構,每個學生可以有很多科目,每個科目可以屬於很多學生。例如,John Doe(學生1)註冊了微積分(學科1)和物理(學科2)。 Joe Bob(學生2)與John Doe一起參加了地理學(主題3)和物理學(主題2)。
在這個例子中,每個學生都參加了兩個科目,兩個學生都參加了一個科目。以你從w3schools.com鏈接的例子來說,這種多對多的關係是不可能的。
數字'auto_increment'必須在同一個表內唯一,而不是跨越所有表。當你談論交叉表值時,你會進入外鍵約束的範圍,這可以被看作是從你連接的任何表中查找。這是表的工作被鏈接到,但強制執行主鍵是唯一的。鏈接的表必須僅驗證該值是否鏈接到表。 *** TLDR:***您可以安全地在多個表中使用數字「auto_increment」。 – War10ck
我希望它是主鍵。主鍵在整個數據庫中必須是唯一的,不是嗎? – NulisDefo
每桌,是的。考慮這樣的數據結構:數據庫名稱>表名> ID(數字主鍵)。你永遠不會在同一個數據庫中擁有相同的組合。你也可以像這樣表示:'dbname.students.id'在整個數據庫中是唯一的。但是'dbname.subjects.id'也是如此。兩者都是數字'auto_increment'鍵,但在數據庫實例中都是唯一的。 – War10ck