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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top