L'aggiornamento di una colonna indicizzata FTS restituisce "ID DOC FTS innodb non valido"
-
31-10-2019 - |
Domanda
Ambiente:
- Ubuntu 12.04 (e 13.04)
- Mysql 5.6.11
Ho una tabella che ha un indice di testo completo su di esso (la tabella reale ha molte più colonne e righe):
DROP TABLE IF EXISTS articles;
CREATE TABLE articles (
FTS_DOC_ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
id INT NOT NULL ,
title VARCHAR(200),
body TEXT,
UNIQUE KEY (FTS_DOC_ID)
) ENGINE=InnoDB;
CREATE FULLTEXT INDEX idx on articles (title);
INSERT INTO articles(id,title,body)
VALUES (9, 'MySQL Tutorial','DBMS stands for DataBase ...');
La documentazione MySQL suggerisce di creare FTS_DOC_ID (con la sintassi giusta) per impedire una ricostruzione della tabella completa.
Finora tutto va bene e posso interrogare usando il MATCH...AGAINST
Per utilizzare l'indice FTS. Tuttavia, quando devo aggiornare una colonna indicizzata:
UPDATE articles set title = 'New MySQL Tutorial' WHERE id=9;
Ottengo un:
Error code 182, SQL state HY000: Invalid InnoDB FTS Doc ID
Se mi prendo cura manualmente di questa colonna in questo modo:
UPDATE articles a1, (SELECT MAX(FTS_DOC_ID)+1 AS ftsid FROM articles) a2
set title = 'New MySQL Tutorial', FTS_DOC_ID=ftsid WHERE id=9;
Quindi l'aggiornamento viene eseguito. Ma questo non è accettabile perché ho diversi processi in parallelo che aggiornano questa tabella (anche se tutte le righe diverse) e il rischio è ottenere lo stesso ftsid
in processi diversi. Si noti che aggiornare il body
La colonna che non è indicizzata dall'indice FTS non ha questo comportamento. Cioè:
UPDATE articles set body = 'Info: DBMS stands for DataBase ...' WHERE id=9;
Aggiorna correttamente il database.
È il comportamento previsto? o è un bug?
Ho trovato un insetto riportato nella buglist MySQL sul caso opposto (non è in grado di aggiornare una colonna indicizzata non FTS ma può su una FTS indicizzata) ma non in questo caso.
Nessuna soluzione corretta