1
votes

Mettre à jour la même table de colonne

J'ai un problème lorsque j'essaye de mettre à jour une valeur dans une base de données de lignes. J'ai besoin d'une mise à jour (ajouter 1 heure) pour certains utilisateurs dans une table USER.

Error Code: 1093. You can't specify target table 'USER' for update in FROM clause

Mais lorsque j'exécute la prochaine UPDATE, affiche une erreur

UPDATE USER
set dateOfBirth = DATE_ADD(dateOfBirth, INTERVAL 1 HOUR)
where id in (select u.id FROM USER u where u.dateOfBirth like '%23:00:00%');

Erreur:

SELECT DATE_ADD(dateOfBirth, INTERVAL 1 HOUR), dateOfBirth 
from USER 
where dateOfBirth like '%23:00:00%';

Il est possible d'exécuter cette phrase d'une autre manière?


3 commentaires

USER est un mot-clé mysql réservé


Une date de naissance a-t-elle besoin d'une heure? Peut-être qu'un type DATE simplifierait certaines choses


Plus je regarde ce qui est fait ici, plus cela ressemble à une solution pour quelque chose qui s'est produit en raison d'un problème de fuseau horaire ou de changement d'horloge été / hiver. Faites donc simplement de la colonne un type DATE et évitez que ce hoquet ne se reproduise


3 Réponses :


1
votes

L ' id n'est-il pas unique dans le tableau? Si c'est le cas:

update user u
    set dateOfBirth = DATE_ADD(dateOfBirth, INTERVAL 1 HOUR)
where time(u.dateOfBirth) = '23:00:00';

Notez que le dateOfBirth est apparemment une colonne de date / heure (pourquoi il contient une heure que je ne comprends pas). Ainsi, les fonctions date / heure sont plus appropriées pour la comparaison.


6 commentaires

"pourquoi il contient une heure que je ne comprends pas" Et si vous devez calculer un calcul d'âge précis? Annyhow + 1


Salut @RaymondNijland J'adorerais connaître une situation où mon âge doit être connu avec précision :) :) Mais alors je suis un vieux git


Bonjour @RiggsFolly à l'hôpital peut-être ou votre commentaire était-il une question rhétorique :-)


@RaymondNijland. . . La colonne s'appelle dateOfBirth . Les choses appelées dates devraient être des dates. Et, en particulier avec quelque chose comme "date de naissance", il est vraiment trompeur d'avoir une composante de temps dans la colonne. S'il s'agit d'un hôpital, alors DatetimeOfBirth serait approprié.


En regardant ce que fait la requête, je devinerais qu'il s'agit d'un correctif pour un problème de fuseau horaire ou de changement d'horloge qui ne serait pas un problème pour une colonne DATE :)


Gordon et @RiggsFolly, nous prenons tous cette voie au sens littéral, je geuss :-) mais vous avez raison Date time Of Birth serait plus approprié



2
votes

Quel est le problème avec:

UPDATE USER
SET dateOfBirth = DATE_ADD(dateOfBirth, INTERVAL 1 HOUR)
WHERE dateOfBirth like '%23:00:00%';


0 commentaires

3
votes

La sous-requête de la mise à jour n'est pas requise.

UPDATE USER
set dateOfBirth = DATE_ADD(dateOfBirth, INTERVAL 1 HOUR)
where dateOfBirth like '%23:00:00%';


0 commentaires