Felix Riesterer: SQL UPDATE betrifft keine Datensätze, gleichlautendes SELECT aber schon

Liebe Mitlesende,

ich stehe vor einem Rätsel mit meinem MariaDB-/MySQL-Server. Folgende Query bringt mir eine Menge an Treffern:

SELECT *
FROM `events`
WHERE `end` IS NULL
 AND TIME('00:00:00') = TIME(`start`)

phpMyAdmin: Zeige Datensätze 0 - 24 (47 insgesamt…)

Möchte ich die so gefundenen Datensätze mit UPDATE ändern, wird nichts verändert:

UPDATE `events`
SET `all_day` = 1
WHERE `end` IS NULL
 AND TIME('00:00:00') = TIME(`start`)

phpMyAdmin: 0 Datensätze betroffen

Falls von Bedeutung, all_day ist vom Typ TinyINT(1) mit Default 0.

Wer weiß Rat?

Liebe Grüße

Felix Riesterer

  1. Hallo Felix Riesterer,

    gibt's denn was zu tun? Heißt: ist all_day in einem der Treffer ungleich 1? Hast du dem SELECT im WHERE mal

    AND `all_day` <> 1
    

    hinzugefügt?

    Wenn was zu tun ist: ich stimme dir bei, dass kann nicht sein. Hast du das SQL für die Frage vereinfacht oder ist das exakt das verwendete SQL?

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Lieber Rolf,

      AND `all_day` <> 1
      

      die Spalte all_day ist in allen Datensätzen 0. Das UPDATE verändert daran leider nichts.

      Hast du das SQL für die Frage vereinfacht oder ist das exakt das verwendete SQL?

      Ich verwende das SQL exakt so.

      Liebe Grüße

      Felix Riesterer

      1. Hallo Felix,

        dann schließe ich mich deiner Meinung an: „WTF?“

        Ist events eine Table? Oder ein View? Welchen Datentyp hat die Spalte start?

        Gibt es Trigger? Column-bezogene Rechtevergabe? myPhpAdmin sollte ja bei Rechteverletzungen eine passende Meldung werfen, aber ich habe ja keine Ahnung, was genau Du da geschnitzt hast…

        Kannst Du das Problem auf eine Tabelle felix mit den Spalten end, all_day und start reduzieren? Wenn nicht - welche Unterschiede sind bei der Reduktion entstanden?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Lieber Rolf,

          Ist events eine Table? Oder ein View? Welchen Datentyp hat die Spalte start?

          Der Vollständigkeit halber hier ein auf das Wesentliche gekürzte CREATE:

          CREATE TABLE `events` (
            `event` int NOT NULL COMMENT 'ID of an event entry',
            `start` datetime NOT NULL COMMENT 'Start time and day.',
            `end` datetime NOT NULL COMMENT 'End time and day.',
            `all_day` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Indicator for the duration of a whole day making start and end time meaningless.',
            `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'A short description or name of the event.',
            `occasion` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'A longer description of the event.',
            `notices` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Additional information on the event.',
            `contact` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Some note as for who to contact about this event.',
            `organizer` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The login name of the user who made the event entry. This references the respective user in the users table.'
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
          

          Gibt es Trigger? Column-bezogene Rechtevergabe? myPhpAdmin sollte ja bei Rechteverletzungen eine passende Meldung werfen, aber ich habe ja keine Ahnung, was genau Du da geschnitzt hast…

          Trigger? Ich weiß wie man das buchstabiert… Nee, im Ernst, überhaupt nichts mit fancy Sachen wie Constraints oder dergleichen.

          Liebe Grüße

          Felix Riesterer

  2. Aloha ;)

    Ich habs zwar am Samstag nicht mehr geschafft, bin aber jetzt zum Testen gekommen.

    Bei mir:

    ich stehe vor einem Rätsel mit meinem MariaDB-/MySQL-Server. Folgende Query bringt mir eine Menge an Treffern:

    SELECT *
    FROM `events`
    WHERE `end` IS NULL
     AND TIME('00:00:00') = TIME(`start`)
    

    phpMyAdmin: Zeige Datensätze 0 - 24 (47 insgesamt…)

    Da findet er mir 97 Datensätzen (frag mich nicht von wann mein DB-Stand ist)...

    Möchte ich die so gefundenen Datensätze mit UPDATE ändern, wird nichts verändert:

    UPDATE `events`
    SET `all_day` = 1
    WHERE `end` IS NULL
     AND TIME('00:00:00') = TIME(`start`)
    

    phpMyAdmin: 0 Datensätze betroffen

    ...und hier sagt er mir:

    97 Datensätze betroffen. (Die Abfrage dauerte 0.0132 Sekunden.)

    Es scheint also funktioniert zu haben. Ich habe beide Queries direkt hier raus kopiert und in phpMyAdmin eingefügt.

    Warums bei dir nicht funktioniert ist mir ein Rätsel.

    Softwareversionen:

    • phpMyAdmin 5.2.1
    • MySQL 8.0.45-0ubuntu0.24.04.1
    • PHP 8.3.6
    • LinuxMint 22.3

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Albers-Zoller
    # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
    1. Lieber Camping_RIDER,

      Bei mir: […]
      97 Datensätze betroffen. (Die Abfrage dauerte 0.0132 Sekunden.)

      NEID

      Softwareversionen:

      • phpMyAdmin 5.2.1

      Bei mir auch!

      • MySQL 8.0.45-0ubuntu0.24.04.1

      Bei mir auch!

      • PHP 8.3.6

      Bei mir auch!

      • LinuxMint 22.3

      Bei mir auch!

      Selbst auf der Shell erhalte ich das identische Ergebnis:

      mysql> UPDATE `events`
          -> SET `all_day` = 1
          -> WHERE `end` IS NULL
          ->  AND TIME('00:00:00') = TIME(`start`)
          -> ;
      Query OK, 0 rows affected (0,00 sec)
      Rows matched: 47  Changed: 0  Warnings: 0
      
      mysql> 
      

      (frag mich nicht von wann mein DB-Stand ist)...

      Meiner war frisch vom Production-System gezogen. Aber dann hatte ich einige Änderungen an der Struktur gemacht, insbesondere die Varchar-Werte von utf8mb3 auf utf8mb4 verändert. Aber die sind für die Queries ja völlig ohne Bedeutung!

      Also noch einmal von vorne: Von Production exportieren und lokal importieren. Tja... was soll ich sagen, dann klappt's!

      Werde nun Schritt für Schritt die Alterationen nachvollziehen, um herauszufinden, welche dafür sorgt, dass die UPDATE-Query nicht mehr greift.

      OK, erledigt. Alterationen Schritt für Schritt wieder vorgenommen. Und noch immer greift das UPDATE.

      Ergebnis: Fluke - nicht reproduzierbarer Fehler. Ich verschwende keine weitere Zeit damit und arbeite weiter.

      Liebe Grüße

      Felix Riesterer

      1. Hallo Felix und Janosch,

        das WTF wird jetzt eher größer als kleiner. Wenn solche Effekte durch das Übertragen der Prod-DB auf das Testsystem auftreten können, hätte ich Angst um das Gesamtsystem…

        Aber wenn es jetzt weg ist, dann hoffen wir mal auf das Beste 😉

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Lieber Rolf,

          meine Manieren!? Ich habe völlig vergessen Danke zu sagen. Du bist so eine treue Seele, die sich aller dieser Sorgen und Nöte sehr zeitnah annimmt. Das ist für das Forum ein echter Gewinn! Daher: DANKE!

          das WTF wird jetzt eher größer als kleiner. Wenn solche Effekte durch das Übertragen der Prod-DB auf das Testsystem auftreten können, hätte ich Angst um das Gesamtsystem…

          Klar. Aber es ist eine händische Übertragung gewesen: phpMyAdmin -> als Text exportieren und dann lokal bei phpMyAdmin per copy&paste einfügen. Das kann eine Ursache gewesen sein, sollte aber nicht. Gerade hatte ich das in eine Datei schreiben lassen und diese dann lokal hochgeladen.

          Aber wenn es jetzt weg ist, dann hoffen wir mal auf das Beste 😉

          Es ist ja „nur“ ein Kalender mit Terminen. Das ist ohnehin eine größere Baustelle, weil mir gerade Design-Entscheidungen von vor zehn Jahren auf die Füße fallen, weil sich mittlerweile die Anforderungen verändert haben. Also geht es im Wesentlichen darum, den aktuellen Datenbestand einigermaßen(!) zu konvertieren und für die neuen Strukturen fit zu machen.

          Liebe Grüße

          Felix Riesterer