char[] characters;
...
string s = new string(characters);
Это может произойти, если вы обновите поле, помеченное UNIQUE
, и второе нарушение ключа произойдет при UPDATE
.
Обновление :
Судя по структуре вашей таблицы, это именно ваш случай.
Вот что происходит:
INSERT INTO linked_mem
( id1, id2, id31, id4 cnt)
VALUES (31316, 0, 557158967, 261470594, 1)
-- inserts
INSERT INTO linked_mem
( id1, id2, id31, id4 cnt)
VALUES (31316, 0, 557158967, 261470594, 1)
-- updates `cnt` to 2
INSERT INTO linked_mem
( id1, id2, id31, id4 cnt)
VALUES (31316, 0, 557158967, 261470594, 1)
-- tries again to update `cnt` to 2 and fails
Удалите cnt
из определения PRIMARY KEY
.
cnt
находится в первичном ключе, возможно, именно поэтому возникла ошибка / невозможность ОБНОВИТЬ его.
Are you sure that the primary key is correct? Using this primary key identifies a line also by the value of cnt, which is supposed to be a counter.
I've not tested this, but I think the following query will give the error if you start with an empty table.
INSERT INTO linked_mem
( id1, id2, id31, id4, cnt)
VALUES
(1, 1, 1, 1, 1), // (1, 1, 1, 1, 1) added
(1, 1, 1, 1, 1), // (1, 1, 1, 1, 1) -> (1, 1, 1, 1, 2)
(1, 1, 1, 1, 1), // (1, 1, 1, 1, 1) added (now two rows)
(1, 1, 1, 1, 1) // error
ON DUPLICATE KEY UPDATE cnt = cnt+1
at the fourth row, the (1, 1, 1, 1, 1) would be updated to (1, 1, 1, 1, 2), but this already exists.
Трудно сказать по вашим неинформативным именам столбцов, но этот первичный ключ настолько широк, что выглядит чертовски бесполезным. Что он на самом деле делает и почему был выбран этот набор столбцов? Есть ли лучший выбор? Я предполагаю, что другие плакаты правы, и ваше обновление нарушает неявную константу уникальности PK; поскольку count является одним из столбцов PK, этого вполне ожидаемо.