2010-03-26 73 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)