2011-02-04 54 views
5

我有一個表foo,它被'created_at'分區,其主鍵爲(id,created_at)。即:如何在分區MySQL數據庫的字段中添加唯一索引?

CREATE TABLE `foo` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `bar_id` int(11) DEFAULT NULL, 
    ... 

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 
/*!50100 PARTITION BY RANGE (TO_DAYS(created_at)) 
(PARTITION p0 VALUES LESS THAN (733712) ENGINE = InnoDB, 
PARTITION p1 VALUES LESS THAN (733773) ENGINE = InnoDB, 
PARTITION p2 VALUES LESS THAN (733832) ENGINE = InnoDB, 
PARTITION p3 VALUES LESS THAN (733893) ENGINE = InnoDB, 
... 
) 

如何創建唯一索引,使得bar_id在所有分區獨特之處?如果我嘗試類似:

CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id); 

我收到的錯誤:

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function 

但是,如果我包括分區功能(idcreated_at)建設則索引當我結束了一個索引並不保證bar_id是唯一的。

UPDATE

我應該提到,我已經對錶的主鍵:

PRIMARY KEY (`id`,`created_at`) 

此外,bar_id可以爲NULL。

+2

嘿,你找出一個辦法嗎?我正在努力解決完全相同的問題。我甚至不明白爲什麼分區鍵必須是唯一鍵的一部分。無法理解它。 – varunl 2012-08-28 18:43:52

+0

@varunl,我也有同樣的問題。我需要使用`start datatime`字段作爲分區鍵,並使用'id`字段作爲主鍵,但是我必須將其他字段作爲UNIQUE KEY,這些字段確實需要是唯一的。 – shgnInc 2015-04-23 06:07:01

回答

0

創建一個主鍵。

MySQL docs分區:用於分區表達式的任何列必須是表的主鍵(如果有)或(第一個)唯一鍵(如果它具有唯一鍵但沒有主鍵)的一部分。否則,您將看到錯誤消息「主鍵需要在分區函數中包含所有字段」。

如果一個表沒有主鍵,但確實有一個或多個唯一鍵,那麼在分區表達式中使用的任何列都必須是(第一個)唯一鍵的一部分。

+0

我應該提到我已經在表上有一個主鍵:PRIMARY KEY(`id`,`created_at`)。另外,bar_id可以是NULL。 – 2011-02-05 22:22:25

0

這可以通過輔助表來存儲唯一的bar_id和插入前觸發器。

+0

這是一個有趣的方法。不幸的是,這意味着我需要編寫一個例程(或更多)來處理bar_id更新爲NULL或更改爲foo中給定行的情況,是否正確?看起來像很多開銷,這使我相信必須有一個更簡單的解決方案。 – 2011-02-05 22:59:00