2009-08-04 7 views
5

Je suis en train de faire une mise à jour, en MySQL 5.0, de la forme:MySQL 1443: qu'est-ce que ça veut dire?

update mytable.myfield t 
set f = 'blah' 
where t.id in (select v.id from myview v where ...); 

MySQL me dit:

ErrorNr. 1443 
The definition of table 'v' prevents operation UPDATE on table 't'. 

La liste docs MySQL cette erreur, mais (comme d'habitude) don ne dis pas ce que ça veut dire. Quelqu'un peut-il faire la lumière sur ce pour moi? Je référence uniquement la vue dans la sous-requête, et je ne fais référence à la table que dans la requête principale, et je ne sais pas pourquoi cela empêcherait la mise à jour. La seule chose que j'ai trouvé avec google est un bug dans le db bug de MySQL lié aux déclencheurs, mais (AFAIK) il n'y a pas de déclencheur dans ma base de données.

+3

Est-ce que "myview" référence "mytable" n'importe où? –

Répondre

7

Je pense que la vue myview doit reposer sur la table matable, de sorte que cela modifie myfield, il perd la trace de ce qui est dans la vue et fait donc une mise à jour illégale.

Je vous recommande de regarder la définition de myview, afin que vous puissiez écrire votre requête sans la référencer. Ensuite, vous pourrez peut-être vous en sortir.

Vous pouvez également vider la liste des ID dans une table temporaire et l'utiliser pour votre sous-requête.

Rob

+0

"vider la liste des IDs à ​​une table temporaire" -> c'est ce que j'ai fini par faire. Dans (My) SQL, chaque fois que j'écris une requête qui est logiquement correcte, le SGBDR a géré la création de temporaires comme nécessaire (EXPLAIN le dit!), Donc il ne m'est pas venu à l'esprit que MySQL * pourrait jamais dire "Je ne suis pas Je vais le faire parce que cela m'obligerait à créer une table temporaire "(bien que dans un verbiage beaucoup plus confus). Merci pour le conseil. – Ken

Questions connexes