-1
votes

Comment mettre à jour les données de colonne en fonction de la requête SELECT et Mettre à jour

J'ai suivi des données xxx pré>

ci-dessus des données ci-dessus est une colonne code> DateTime > dans une table Build code> p>

maintenant J'ai besoin d'écrire la requête pour accomplir après P>

1: changez l'année de 2015 à 2019 et tout reste tout devrait rester comme il est P>

Voici comment j'ai écrit la requête

mysql> UPDATE buildinfo SET datetime = '2019%' where datetime = (select a.datetime from buildinfo as a where datetime LIKE '2015%');
ERROR 1093 (HY000): You can't specify target table 'buildinfo' for update in FROM clause
mysql>


0 commentaires

6 Réponses :


1
votes

Les valeurs DateTime ne sont pas toujours une chaîne et vous pourriez trouver dans MySQL-8.0, ils ne fonctionnent pas. Heureusement, il y a une quantité riche de date et heure Fonctions .

SO: P>

UPDATE buildinfo
SET datetime=DATE_ADD(datetime, INTERVAL 4 YEAR)
WHERE datetime BETWEEN '2015-01-01 00:00:00' AND '2015-12-31 23:59:59'


7 commentaires

Eh bien, vous peut . Notez également que où datetime entre '2015-01-01 00:00:00' et '2015-12-31 23:59:59' prend plus de temps à taper, mais est plus rapide à exécuter ( sur une table indexée)


Vous êtes définitivement peut utiliser des fonctions de correspondance de chaîne


Vous aviez l'habitude de pouvoir utiliser des fonctions de chaîne, Fiddle , semblait s'arrêter dans mysql8 .0.x Bien que <= 5.7 et Mariah et Mariadb puisse toujours le faire.


Ce qui a du sens, car DateTime n'est pas un fichier de données de char ou de texte Varcharner où un comme devrait fonctionner. Je me demande si remplacer () La réponse acceptée fonctionnera toujours dans MySQL 8


"Ce qui a du sens, car DateTime n'est pas un fichier de données de Varcharner ni de type de type texte dans lequel une personne semblable devrait fonctionner. Je me demande si remplacer () la réponse acceptée fonctionnera toujours dans MySQL 8" doit aimer l'incohérence dans Mysql .. dbfiddle.uk/...


Remplacer réellement fonctionne. Yeh, cohérence et compatibilité, je dois l'aimer.


Peut-être une question de quelques mises à jour avant les fonctions de chaîne comme remplacer () arrêtez également de fonctionner sur ce DateTime DataType qui sait?



0
votes

Veuillez essayer d'utiliser Date_Format avec la requête de mise à jour

UPDATE buildinfo
SET `datetime` = DATE_FORMAT(`datetime`,'2019-%m-%d %T')
WHERE YEAR(`datetime`) = '2015';


0 commentaires

0
votes

Une alternative à Danblacks Répondre, à l'aide des fonctions de correspondance de chaîne:

UPDATE
  build
SET
  `datetime` = CONCAT('2019', RIGHT(`datetime`, 15))
WHERE
  LEFT(`datetime`, 4) = '2015'


6 commentaires

Avoir des difficultés à obtenir cela à Travail , choisissez une version.


Vous avez raison, j'aurais dû lancer le DateTime d'abord, mais je supprimerai la fonction comme et utilisez gauche


Peut-être qu'il est préférable d'éviter les fonctions de chaîne sur daTétime . Comme indiqué par @danblack comme stopt fonctionnant sur DateTime DataType dans mysql 8, peut-être un Matière de quelques mises à jour avant les fonctions de chaîne telles que Droite () et 'GAUCHE ()' ASSAIRE AUSSI TRAVAILLER. Qui sait?


Peut-être ... je serais d'accord pour dire que ce n'est certainement pas la meilleure façon de le faire - cependant, je ne suis pas un fan de l'idée "Les développeurs peuvent Décapez une fonctionnalité, nous devrions donc cesser d'utiliser. » Une fois la dépréciation confirmée, bien sûr. Mais jusque-là, c'est complètement valable, peut-être juste une mauvaise pratique?


Aussi + est SQL Server Concat dans MySQL, vous devez utiliser concat () Je viens de remarquer. "Cependant, je ne suis pas fan de l'idée" Les développeurs peuvent se désactiver une fonctionnalité, nous devrions donc arrêter de l'utiliser. " Bien qu'il a été défini dans les normes ANSI / ISO SQL comment les fonctions de chaîne devraient fonctionner et sur lesquelles de sorte que ce n'est pas vraiment une dépréciation qu'elle n'a aborge que Démarrer .. MEME EXEMPLE DU MYSQL Autorisé les colonnes non agrégées dans le Select qui ne sont pas dans le groupe par le passé, il n'est pas valide avec les normes ANSI / ISO SQL à l'esprit, mais aux coûts que vous avez joué à la roulette russe avec vos bagriolages.


@Raymondnijland +1. Je n'avais pas vérifié les normes SQL sur les fonctions de cordes, mais que je me suis déjà fait, je suis enclin à être d'accord avec vous.



1
votes

Ajouter 4 ans aux dates où l'année est 2015: xxx

Voir le Demo .


0 commentaires

2
votes

ESSAYEZ CE STRAND>

UPDATE buildinfo set datetime = replace(datetime, '2015', '2019') where datetime LIKE '2015%';
  • Mais avant d'appliquer cela, faites une sauvegarde des données stockées. LI> ul> p>


2 commentaires

Peut-être qu'il est préférable d'éviter les fonctions de chaîne sur daTétime . Comme indiqué par @danblack comme stopt fonctionnant sur DateTime DataType dans mysql 8, peut-être un Matière de quelques mises à jour avant les fonctions de chaîne telles que Remplacer () Arrêtez également de fonctionner. Qui sait?


Je reçois la clause omission de 5,7 SO 5.6 et Mariahb sont des options de travail seul. Peut être effectué dans un ensemble de mode SQL, mais cela ne fait que travailler avec des hacks.



0
votes

Si la mise à jour

UPDATE
  buildinfo
SET
 buildinfo.datetime = buildinfo.datetime + INTERVAL 4 YEAR
WHERE
 YEAR(buildinfo.datetime) = 2015


0 commentaires