2010-03-26 106 views
0

我創建一個表:MySQL的唯一聚集約束不約束預期

CREATE TABLE movies 
(
id  INT  AUTO_INCREMENT PRIMARY KEY, 
name CHAR(255) NOT NULL, 
year INT  NOT NULL, 
inyear CHAR(10), 
CONSTRAINT UNIQUE CLUSTERED (name, year, inyear) 
); 

(這是JDBC SQL)

與一個clustered指數「指數樣」創建MySQL表是 「獨一無二」,且跨越三個集羣列:

mysql screen http://img510.imageshack.us/img510/930/mysqlscreenshot.th.jpg
full size

但是,一旦我傾倒我的數據(沒有拋出異常),我看到的唯一性約束失敗:

SELECT * FROM movies 
WHERE name = 'Flawless' AND year = 2007 AND inyear IS NULL; 

給出:

id,  name,  year, inyear 
162169, 'Flawless', 2007, NULL 
162170, 'Flawless', 2007, NULL 

有誰知道我在做什麼錯在這裏?

+0

您所選擇的獨特組合鍵索引名稱「CLUSTERED」令人困惑。你知道聚集索引是什麼嗎?如果您使用的是innodb,那麼您爲表定義的每個主鍵都是聚簇索引。每個innodb表只能有一個聚簇索引作爲聚簇索引,根據索引鍵值對數據行進行排序並存儲在表中。因此,只能在每個表上創建一個聚簇索引,因爲數據行本身只能按一個順序排序。 http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html – 2010-03-26 07:33:42

回答

4

MySQL不認爲NULL值相等;因此,爲什麼獨特的約束似乎不起作用。爲了解決這個問題,你可以添加一個計算列的表,其定義爲:

nullCatch as (case when inyear is null then '-1' else inyear) 

替代此列在約束「inyear」:

CONSTRAINT UNIQUE CLUSTERED (name, year, nullCatch)