2012-01-10 120 views
0
DROP TABLE IF EXISTS `media_publications`; 
CREATE TABLE `media_publications` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `media_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `description` varchar(1000) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY (`id`,`user_id`) 
) ENGINE=INNODB; 

id作爲主鍵在這裏是毫無意義的嗎?我是否應該只有id + user_id作爲主鍵考慮我需要它作爲另一個表的外鍵?主要練習

+0

嗯,爲什麼在另一個表中爲什麼'id'對FK還不夠呢? – zerkms 2012-01-10 10:26:53

+1

組合'media_id'和'user_id'是否唯一標識一行? – Oded 2012-01-10 10:28:46

+0

使用InnoDB引擎,幾乎不會出錯將PK設置爲auto_increment字段。 – 2012-01-10 10:37:42

回答

2

您必須具有id作爲主鍵,因爲它是AUTO_INCREMENT並且您正在使用InnoDB。你可以創建一個唯一的索引在2列(我把第一個user_id)用於子表外鍵

+0

爲什麼把user_id放在第一位? – 2012-01-10 11:05:41

+0

@amiawizard:因此它對查詢user_id本身很有用 – gbn 2012-01-10 11:15:46

0

不是每個唯一的行組合應該是主鍵。可能你可以用這種方式使用它,但這將是一個尷尬的解決方案。

0

將主鍵明確標記爲主鍵是一個好主意。

這樣你就不必添加另一個索引,它將部分地將主鍵或外鍵複製到users表(儘管後者當前不存在)。

P.S.許多人似乎將身份領域與主鍵混淆。身份字段可以很容易地成爲主鍵的一部分(但如果表是InnoDB,並且該字段是自動增量整數,則應該是前綴)。

0

由於主鍵始終是InnoDB中二級索引中的最後一個鍵(雖然優化器並不總是佔用此優勢),因此在ID,user_id上使用鍵是毫無意義的,並且由於鍵只能在左側大部分都是指定的。因此,無論是僅在user_id上創建密鑰,還是在user_id,id上的user_id/id上都應該是唯一的。這樣,你可以在這兩個查詢中使用索引WHERE id =WHERE user_id =