Дубликат записи для ключа 'PRIMARY' в mysql

у меня есть таблица под названием tbl_jobs, который хранит метаданные некоторых фоновых заданий, запущенных в приложении. Схема выглядит так:

CREATE TABLE `tbl_jobs` (
  `type` varchar(30) NOT NULL DEFAULT '',
  `last_run_on` datetime NOT NULL,
  `records_updated` text,
  PRIMARY KEY (`type`,`last_run_on`),
  UNIQUE KEY `index2` (`type`,`last_run_on`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

всякий раз, когда задание выполняется, оно делает запись в таблице с type, который является уникальным идентификатором для различных рабочих мест, run time и records updated в этой перспективе.

есть два разных задания, которые выполняются одновременно с вида : MAILER_UNLOCKED_REWARDS и MAILER_ALMOST_UNLOCKED.

когда эти задания пытаются вставить свои записи с той же меткой времени только один из них вставляется, а другой бросает дубликат ключа ошибка.

например, два задания выполнялись следующим образом:

INSERT INTO tbl_jobs
            (type,
             last_run_on,
             records_updated)
VALUES     ('MAILER_ALMOST_UNLOCKED',
            '2012-08-22 19:10:00',
            'f8a35230fb214989ac75bf11c085aa28:b591426df4f340ecbce5a63c2a5a0174')

это было успешно выполнено, но когда второе задание выполнило команду insert

INSERT INTO tbl_jobs
            (type,
             last_run_on,
             records_updated)
VALUES     ('MAILER_UNLOCKED_REWARDS',
            '2012-08-22 19:10:00',
            '8a003e8934c07f040134c30959c40009:59bcc21b33a0466e8e5dc50443beb945')

он бросил ошибка

Duplicate entry 'M-2012-08-22 19:10:00' for key 'PRIMARY'

первичный ключ является комбинацией type и last_run_on столбцы.

если я удалю запись для первого задания, мне это удалось.e он просит должен быть уникальным.

однако конфликт для того же timestamp возникает только между этими двумя заданиями.Есть другие задания, которые вставляются для того же timestamp.

любые идеи о том, что может быть проблема?

3 ответов


используете ли вы все поле " тип " в своем индексе? Или только первый персонаж? Потому что ключ MySQL жалуется на

M-2012-08-22 19:10:00

вместо MAILER_...

попробуй:

 SHOW INDEXES FROM tbl_jobs;

это должно дать что-то вроде:

+----------+------------+----------+--------------+-------------+-----------+-------------+    ----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tbl_jobs |          0 | PRIMARY  |            1 | type        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| tbl_jobs |          0 | PRIMARY  |            2 | last_run_on | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

...

и я подозреваю, что он покажет вместо " 1 " в столбце Sub_part основного индекса:

+----------+------------+----------+--------------+-------------+-----------+-------------+    ----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tbl_jobs |          0 | PRIMARY  |            1 | type        | A         |           0 |        1 | NULL   |      | BTREE      |         |               |
| tbl_jobs |          0 | PRIMARY  |            2 | last_run_on | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |

...

BTW, первичный ключ всегда уникален, поэтому второй индекс index2 вы заявляете, что это избыточно.


первое: вы должны убедиться, что первичный ключ был установлен AUTO_INCREMENT. Второе: вы просто включаете автоматическое приращение на : ALTER TABLE [имя таблицы] AUTO_INCREMENT = 1 Третье: при выполнении команды insert вы должны пропустить этот ключ.


Я видел эту ошибку, если у меня есть выключение системы или проблема с сетью. У вас действительно нет дубликата в вашей БД. Это ошибка MySQL db. Все, что вам нужно сделать, это: если вы делаете свою вставку, и это не true, просто измените один из столбцов вашей таблицы, которую вы хотите вставить в любой из varchar to text или bigint а затем повторите вставку. Это решает проблему.

If(!$insert)
{    
$alter=Mysql_query("alter table     

`table_name` change `table_name` 

`table_name` bigint(255) not null");    

If($alter){

//you then redo your insertion.     

} 


}