2016-12-15 42 views
0

我在尋找auto_increment,我想自動生成唯一的id主鍵。問題是我只知道如何用數字ID做到這一點。據我所知,主鍵必須是唯一的。所以我不能使用數字auto_increment多個表,因爲id不會是唯一的。下面是我現在該怎麼辦呢:SQL auto_increment非int-only值

CREATE TABLE students (
id int(3) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
name char(20), 
lastname char(20) 
); 

據我所知,這將產生像IDS:1,2,3,4,除非我的名字不同的起始號碼。是否有可能自動增加「stud_1」或「stud_01」之類的東西,然後繼續增加數量?到目前爲止,我還沒有遇到過這樣的例子。

+0

數字'auto_increment'必須在同一個表內唯一,而不是跨越所有表。當你談論交叉表值時,你會進入外鍵約束的範圍,這可以被看作是從你連接的任何表中查找。這是表的工作被鏈接到,但強制執行主鍵是唯一的。鏈接的表必須僅驗證該值是否鏈接到表。 *** TLDR:***您可以安全地在多個表中使用數字「auto_increment」。 – War10ck

+0

我希望它是主鍵。主鍵在整個數據庫中必須是唯一的,不是嗎? – NulisDefo

+0

每桌,是的。考慮這樣的數據結構:數據庫名稱>表名> ID(數字主鍵)。你永遠不會在同一個數據庫中擁有相同的組合。你也可以像這樣表示:'dbname.students.id'在整個數據庫中是唯一的。但是'dbname.subjects.id'也是如此。兩者都是數字'auto_increment'鍵,但在數據庫實例中都是唯一的。 – War10ck

回答

1

我在上面的評論中寫了很多,但讓我將它應用於實踐中的答案。我們將與您的表開始,然後添加兩個:

表:

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.idsubjects.id。第三個表student_subject顯示瞭如何將這些鏈接在一起,其中student_idsubject_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鏈接的例子來說,這種多對多的關係是不可能的。

+0

所以在這裏你創建一個單獨的表來鏈接兩個表。如果不是創建第三個表,我會把外鍵放在前兩個表中,所有東西都可以工作? (類似於開始時顯示的內容:http://www.w3schools.com/sql/sql_foreignkey.asp) – NulisDefo

+0

因此,您發佈的示例是表格之間的1-1(一對一)關係。對於有意義的排序。一旦唯一的訂單號屬於一個獨特的客戶。在上面的例子中,我使用了第三個表來允許多對多的關係。在這種情況下,一名學生可以擁有許多他們參加的科目,一名科目可以有很多學生參加。 – War10ck

+0

好的,只是爲了澄清,如果我理解正確。第三個表格中的關係由您的手手動定義。這是正確的,對嗎? – NulisDefo

0

主鍵值只需要在表中唯一,所以沒有理由不能爲每個表使用簡單的自動遞增數字標識。

至於這個問題 - 我不相信有一種直接的方式來按照你描述的方式「自動遞增」一個字符串值。如果你真的想,你可以設置觸發器和序列(或定期自動增量列)。