2015-02-24 70 views
0

你好,我是MySQL新手,但我想創建一個唯一的ID基於兩個其他表中創建的兩個主鍵。如何創建連接的主鍵?

這裏只是我們感興趣的部分:我覺得我不明白的伎倆

CREATE TABLE patient(
id_patient int NOT NULL AUTO_INCREMENT, 
..., 
PRIMARY KEY (id_patient)) 

CREATE TABLE surgeon(
id_surgeonint NOT NULL AUTO_INCREMENT, 
..., 
PRIMARY KEY (id_surgeon)) 

CREATE TABLE case(
id_patient int NOT NULL, 
id_surgeon int NOT NULL, 
CONSTRAINT FK_case_patient FOREIGN KEY (id_patient) REFERENCES patient(id_patient), 
CONSTRAINT FK_case_surgeon FOREIGN KEY (id_surgeon) REFERENCES surgeon(id_surgeon), 
CONSTRAINT id_case PRIMARY KEY (id_patient, `_`,id_surgeon)); 

。我想下面的結果:

SELECT * FROM case; 

id_case | id_patient | id_surgeon  
32_56 |  32  |  56 
18_66 |  18  |  66 

我知道,計算的速度將不是最優的,但這 ID的情況下真的是必要的,在選擇

+0

爲什麼不選擇存儲爲2列並在選擇期間連接(作爲虛擬列)? – kasoban 2015-02-24 10:28:54

+0

因爲我們需要此ID來識別從數據庫生成的所有文檔。將這個ID作爲主鍵而不是每次計算都比較容易。 但也許我錯了,我不知道...如果我錯了,你能告訴我爲什麼嗎? – Raccoon 2015-02-24 10:38:16

+0

你錯了。你的目標是在選擇過程中看到'32_56'。你可以使用'SELECT CONCAT(id_patient,'_',id_surgeon)作爲my_id'。如果您不想執行此「計算」,則還可以使用與上述相同的「CONCAT」更新列的觸發器。你的主鍵應該是一個普通的auto_increment。並且看到同一位患者可能在稍後的某個時候可能會有相同的外科醫生 - 在「病例」表中組合'(id_patient,id_surgeon)'是一個不好的候選人。 – 2015-02-24 10:45:14

回答

0

您可以創建必須可見計算列,如果你真的想在磁盤上的值,你可以堅持的計算列

CREATE TABLE case(
id_patient int NOT NULL, 
id_surgeon int NOT NULL, 
id_case varchar(30) AS CONCAT(id_patient, '_', id_surgeon), 
CONSTRAINT FK_case_patient FOREIGN KEY (id_patient) REFERENCES patient(id_patient), 
CONSTRAINT FK_case_surgeon FOREIGN KEY (id_surgeon) REFERENCES surgeon(id_surgeon), 
CONSTRAINT pk_case PRIMARY KEY (id_patient,id_surgeon)); 

但是除非你有要求,即對(病人,外科醫生)唯一確定一個案例,你應該考慮在額外的領域(例如手術日期)添加