Дублирование данных при использовании уникального ключа - PullRequest
1 голос
/ 02 сентября 2011

Для моей таблицы я определил уникальный индекс для 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)

Ответы [ 3 ]

2 голосов
/ 02 сентября 2011

Это ожидаемое поведение.Проверьте документацию MySQL: http://dev.mysql.com/doc/refman/5.0/en/create-table.html

Уникальный индекс создает ограничение, так что все значения в индексе должны быть различны.При попытке добавить новую строку со значением ключа, совпадающим с существующей строкой, возникает ошибка.Это ограничение не применяется к значениям NULL, за исключением механизма хранения BDB.Для других механизмов индекс UNIQUE допускает несколько значений NULL для столбцов, которые могут содержать NULL.

1 голос
/ 02 сентября 2011

из-за NULL на дату окончания,
технически NULL <> EMPTY или любое значение, это просто заполнитель, где значение отсутствует

так, измените его на NOT NULL, должно исправить

PS: когда вы делаете Alter

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 голосов
/ 02 сентября 2011

У вас есть значения NULL в конце_даты.

Значение NULL является неопределенным значением, поэтому два значения NULL не совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...