2011-09-02 33 views
1

对于我的表,我已经定义了一个唯一索引activity_id - actor_id - end_date;使用唯一键时复制数据

mysql> show keys from sg_activity_property; 
+----------------------+------------+-------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table    | Non_unique | Key_name | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+----------------------+------------+-------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+---------+ 
| sg_activity_property |   0 | PRIMARY  |   1 | activity_property_id | A   |   506 |  NULL | NULL |  | BTREE  |   | 
| sg_activity_property |   0 | activity_id |   1 | activity_id   | A   |  NULL |  NULL | NULL |  | BTREE  |   | 
| sg_activity_property |   0 | activity_id |   2 | actor_id    | A   |  NULL |  NULL | NULL |  | BTREE  |   | 
| sg_activity_property |   0 | activity_id |   3 | end_date    | A   |  NULL |  NULL | NULL | YES | BTREE  |   | 
+----------------------+------------+-------------+--------------+----------------------+-----------+-------------+----------+--------+------+------------+---------+ 
4 rows in set (0.00 sec) 

那么,这个数据如何存在?

mysql> SELECT activity_property_id, activity_id, actor_id, start_date, end_date FROM `sg_activity_property` WHERE `activity_id` =250; 
+----------------------+-------------+----------+---------------------+----------+ 
| activity_property_id | activity_id | actor_id | start_date   | end_date | 
+----------------------+-------------+----------+---------------------+----------+ 
|     509 |   250 |  8 | 2011-09-02 11:10:50 | NULL  | 
|     510 |   250 |  8 | 2011-09-02 11:10:50 | NULL  | 
+----------------------+-------------+----------+---------------------+----------+ 
2 rows in set (0.00 sec) 

编辑:这里的SHOW CREATE TABLE sg_activity_property输出:

mysql> SHOW CREATE TABLE sg_activity_property; 
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table    | Create Table                                                                                                                                                                                      | 
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| sg_activity_property | CREATE TABLE `sg_activity_property` (
    `activity_property_id` int(10) unsigned NOT NULL auto_increment, 
    `activity_id` int(10) unsigned NOT NULL, 
    `actor_id` int(10) unsigned NOT NULL, 
    `importance` enum('very low','low','normal','high','very high') NOT NULL default 'normal', 
    `urgency` enum('!','!!') default NULL, 
    `completed` tinyint(1) NOT NULL, 
    `start_date` datetime NOT NULL, 
    `end_date` datetime default NULL, 
    `review_frequency` int(11) NOT NULL default '1', 
    `review_frequency_unit` enum('day','week','month','quarter','year') NOT NULL default 'week', 
    PRIMARY KEY (`activity_property_id`), 
    UNIQUE KEY `activity_id` (`activity_id`,`actor_id`,`end_date`) 
) ENGINE=MyISAM AUTO_INCREMENT=511 DEFAULT CHARSET=latin1 | 
+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.19 sec) 
+0

我们可以得到'SHOW CREATE TABLE sg_activity_property'的输出吗? – Bobby

+0

添加输出到帖子! – Rijk

回答

1

因为NULL上END_DATE的,
技术上NULL <> EMPTY或任意数值,只是一个占位符,其中值缺失

因此,将其更改为NOT NULL应修复

PS:当你在做改变

alter table sg_activity_property 
modify column end_date datetime not null 
default '0000-00-00 00:00:00'; 

这将失败,因为MySQL会尝试将NULL转换为0000-00-00 00:00:00
为了解决这个问题,你可以一些随机值首先分配给它,
或者只是简单地删除其中一个副本

+0

不幸的是,我在这里需要'NULL',因为我用它来查找'当前'条目('WHERE end_date IS NULL') – Rijk

+0

您可以随时将其转换为'WHERE end_date = 0' – ajreal

+0

这样的表现会同样出色吗? – Rijk

0

您在end_date中有NULL值。

NULL值是未定义的值,因此两个 NULL值不相同。

+0

两个NULL值是不一样的??这完全让我感到困惑 – Rijk

2

这是预期的行为。检查MySQL文档: http://dev.mysql.com/doc/refman/5.0/en/create-table.html

唯一索引创建,使得该指数 所有的值必须是不同的约束。如果尝试使用与现有行匹配的键值 添加新行,则会发生错误。除了BDB存储引擎之外,此限制不适用于 空值。对于其他引擎, UNIQUE索引允许针对可包含空值的列的多个NULL值。

+0

谢谢你这个有用的评论我会永远不会期望NULL被'跳过' MySQL索引! – Rijk