Bernd: Preis updaten

Moin,

ich versuche per UPDATE direkt in der MySQL Datenbank ein Preis zu ändern

update xUmLObm6Zd_products set products_price=products_price+(products_price*1.05) WHERE NOT permission_id = 1379;

Danach erhalte ich folgende Bestätigung

3182 Datensätze betroffen. (Die Abfrage dauerte 0.0243 Sekunden.)

Und gleichzeitig folgenden Hinweis

Note: #1265 Daten abgeschnitten für Feld 'products_price' in Zeile 2

Dieser taucht mehrfach auf immer mit unterschiedlicher Zeilennummer. Schau ich mir die Preise im Frontend an, hat sich irgendwie nichts getan.

Habe ich irgendein Fehler um Update?

  1. update xUmLObm6Zd_products set products_price=products_price+(products_price*1.05) WHERE permission_id  NOT IN (1379);
    

    auch bei diesem Update tut sich nichts und ich bekomme die gleiche Meldung wie vorhin.

    1. Was ist denn der Datentyp von xUmLObm6Zd_products.products_price?
    2. Gibt es Zeilen in denen products_price leer ist?

    Hint: Es wurden nicht "1265 Daten abgeschnitten". #1265 ist die Nummer des standardisierten Fehlers und besagt, dass Daten nicht übernommen wurden, weil sie nicht in die Spalte passen.

    1. Hallo,

      ist ein XT-Commerce Shop

      1. Was ist denn der Datentyp von xUmLObm6Zd_products.products_price?

      decimal(15,4)

      1. Gibt es Zeilen in denen products_price leer ist?

      wenn ich in phpMyAdmin die Spalte sortiere habe ich tatsächlich zwei leere Einträge bzw. da steht in leichtem Grau Null drin.

      1. Versuche:

        update 
            xUmLObm6Zd_products 
        set
            products_price=products_price+(products_price*1.05)
        WHERE
                permission_id  NOT IN (1379) 
            AND products_price != "";
        

        Oder, vorher:

        update 
            xUmLObm6Zd_products 
        set
            products_price = 0
        WHERE
            products_price = "";
        

        ist ein XT-Commerce Shop

        Schau aber nach Nebenwirkungen. Nicht dass plötzlich was verschenkt wird.

        1. Tach!

          update 
              xUmLObm6Zd_products 
          set
              products_price = 0
          WHERE
              products_price = "";
          

          Das geht nicht, wenn NULL drinsteht. Bei Operationen mit NULL kommt immer NULL raus (außer bei den Spezialoperatoren IS NULL etc.), und NULL wird im booleschen Kontext zu false.

          dedlfix.

          1. Tach!

            update 
                xUmLObm6Zd_products 
            set
                products_price = 0
            WHERE
                products_price = "";
            

            Das geht nicht, wenn NULL drinsteht. Bei Operationen mit NULL kommt immer NULL raus (außer bei den Spezialoperatoren IS NULL etc.), und NULL wird im booleschen Kontext zu false.

            Dann eben:

            update 
                xUmLObm6Zd_products 
            set
                products_price = 0
            WHERE
                products_price = NULL;
            

            Oder:

            update 
                xUmLObm6Zd_products 
            set
                products_price = products_price * 1.05
            WHERE
                    permission_id  NOT IN (1379) 
                AND products_price != NULL;
            
            1. Hi,

              Dann eben:

              update 
                  xUmLObm6Zd_products 
              set
                  products_price = 0
              WHERE
                  products_price = NULL;
              

              Nein, Vergleich mit Null per is null bzw. invertiert mit is not null.

              cu,
              Andreas a/k/a MudGuard

            2. Hall,

              update 
                  xUmLObm6Zd_products 
              set
                  products_price = 0
              WHERE
                  products_price = NULL;
              

              da bekomme ich folgende Ausgabe

              0 Datensätze betroffen. (Die Abfrage dauerte 0.0047 Sekunden.)

              1. Haaach! Guckst Du Mudgard!:

                update 
                    xUmLObm6Zd_products 
                set
                    products_price = 0
                WHERE
                    products_price IS NULL;
                
                1. Hi,

                  Haaach! [Guckst Du Mudgard!]

                  MudGuard! So viel Zeit muß sein!

                  cu,
                  Andreas a/k/a MudGuard

  2. Tach!

    Habe ich irgendein Fehler um Update?

    Bei mir gehts. Was für einen Datentyp hat das Preisfeld?

    dedlfix.

    1. Hallo,

      Bei mir gehts. Was für einen Datentyp hat das Preisfeld?

      decimal(15,4)

  3. Hi,

    update xUmLObm6Zd_products set products_price=products_price+(products_price*1.05) WHERE NOT permission_id = 1379;
    

    Preise auf 205% des vorherigen Preises erhöhen, also mehr als verdoppeln?

    Da würde ich mich auch weigern, wenn ich die Datenbank wäre …

    cu,
    Andreas a/k/a MudGuard

    1. Hallo,

      Preise auf 205% des vorherigen Preises erhöhen, also mehr als verdoppeln?

      wie kommst du auf 205% 😯 *1.05 heißt doch 5%. Gebe ich bei Google 600 * 1.05 komme ich auf 630 Euro.

      1. products_price=products_price+(products_price*1.05)
        
        products_price=600+(600*1.05)
        

        1230

        1. Dann weiß ich auch warum es nicht in die Preis Spalte passt. Wie muss ich dann rechnen?

          1. Wie muss ich dann rechnen?

            set products_price = products_price * 1.05
            

            Schöner schreiben hilft beim Sehen. Und denk an die Erweiterung der Where-Clausel.

            1. Ich habe es so versucht

              update 
                  xUmLObm6Zd_products 
              set
                  products_price = products_price * 1.05
              WHERE
                  permission_id  NOT IN (1379) 
                  AND products_price != "";
              

              Und bekomme jetzt

              Warning: #1292 Falscher DECIMAL-Wert gekürzt: ''

              und

              Note: #1265 Daten abgeschnitten für Feld 'products_price' in Zeile 2

                1. Habe ich, hat nichts genützt. Hab jetzt die zwei leeren raus geworfen und es nochmals versucht, genau die gleiche Fehlermeldung.

                  1. hat nichts genützt.

                    Dann exportiere für uns mal die komplette Tabellendefinition von xUmLObm6Zd_products.

                    Der #1265er besagt, dass MySQL nichts eintragen will, weil der Wert nicht zur Definition passt.

                    1. --
                      -- Tabellenstruktur für Tabelle `xUmLObm6Zd_products`
                      --
                      
                      CREATE TABLE `xUmLObm6Zd_products` (
                        `products_id` int(11) NOT NULL,
                        `external_id` varchar(255) DEFAULT NULL,
                        `permission_id` int(11) DEFAULT NULL,
                        `products_owner` int(11) NOT NULL DEFAULT '1',
                        `products_ean` varchar(255) DEFAULT NULL,
                        `products_quantity` decimal(15,2) DEFAULT NULL,
                        `products_average_quantity` int(11) DEFAULT '0',
                        `products_shippingtime` int(4) DEFAULT NULL,
                        `products_model` varchar(255) DEFAULT NULL,
                        `products_master_model` varchar(255) DEFAULT NULL,
                        `products_master_flag` tinyint(1) DEFAULT NULL,
                        `products_option_template` varchar(255) DEFAULT NULL,
                        `products_option_list_template` varchar(255) DEFAULT NULL,
                        `products_option_master_price` varchar(3) DEFAULT NULL,
                        `price_flag_graduated_all` int(1) DEFAULT '0',
                        `price_flag_graduated_1` int(1) DEFAULT '0',
                        `price_flag_graduated_2` int(1) DEFAULT '0',
                        `price_flag_graduated_3` int(1) DEFAULT '0',
                        `products_sort` int(4) DEFAULT '0',
                        `products_image` varchar(256) DEFAULT NULL,
                        `products_images_url` text,
                        `products_price` decimal(15,4) DEFAULT NULL,
                        `date_added` datetime DEFAULT NULL,
                        `last_modified` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
                        `date_available` datetime DEFAULT NULL,
                        `products_weight` decimal(15,4) DEFAULT NULL,
                        `products_status` tinyint(1) DEFAULT NULL,
                        `products_tax_class_id` int(11) DEFAULT NULL,
                        `product_template` varchar(64) DEFAULT NULL,
                        `product_list_template` varchar(64) DEFAULT NULL,
                        `manufacturers_id` int(11) DEFAULT NULL,
                        `products_ordered` int(11) DEFAULT '0',
                        `products_transactions` int(11) DEFAULT '0',
                        `products_fsk18` int(1) DEFAULT '0',
                        `products_vpe` int(11) DEFAULT NULL,
                        `products_vpe_status` int(1) DEFAULT '0',
                        `products_vpe_value` decimal(15,4) DEFAULT '0.0000',
                        `products_average_rating` decimal(14,4) DEFAULT '0.0000',
                        `products_rating_count` int(11) DEFAULT '0',
                        `products_digital` int(1) DEFAULT '0',
                        `flag_has_specials` int(1) NOT NULL DEFAULT '0',
                        `products_serials` int(1) DEFAULT '0',
                        `total_downloads` int(11) DEFAULT '0',
                        `google_product_cat` varchar(255) NOT NULL,
                        `group_discount_allowed` int(1) NOT NULL DEFAULT '1',
                        `xt_sperrgut_class` int(11) NOT NULL DEFAULT '0',
                        `products_image_updated` int(11) NOT NULL DEFAULT '0',
                        `products_unit` int(11) DEFAULT '39',
                        `products_image_from_master` tinyint(1) DEFAULT NULL,
                        `products_master_slave_order` int(11) NOT NULL
                      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
                      
                      --
                      -- Indizes der exportierten Tabellen
                      --
                      
                      --
                      -- Indizes für die Tabelle `xUmLObm6Zd_products`
                      --
                      ALTER TABLE `xUmLObm6Zd_products`
                        ADD PRIMARY KEY (`products_id`),
                        ADD KEY `idx_products_date_added` (`date_added`),
                        ADD KEY `products_status` (`products_status`),
                        ADD KEY `products_ordered` (`products_ordered`),
                        ADD KEY `manufacturers_id` (`manufacturers_id`),
                        ADD KEY `products_fsk18` (`products_fsk18`),
                        ADD KEY `products_ean` (`products_ean`);
                      
                      --
                      -- AUTO_INCREMENT für exportierte Tabellen
                      --
                      
                      --
                      -- AUTO_INCREMENT für Tabelle `xUmLObm6Zd_products`
                      --
                      ALTER TABLE `xUmLObm6Zd_products`
                        MODIFY `products_id` int(11) NOT NULL AUTO_INCREMENT;
                      COMMIT;
                      
                      1. Kann es z.B. an so einem Eintrag liegen?

                        2411.7647

                        Wenn ich 2411.7647*1.05 rechne erhalte ich 2532.352935 als Ergebnis. Bekomme ich vielleicht ein Platzproblem?

                      2. Hm. Was gibt:

                        select max( `products_price` * 1.05 ) as `max` from `xUmLObm6Zd_products`;
                        

                        und

                        select min( `products_price` * 1.05 ) as `min` from `xUmLObm6Zd_products`;
                        

                        aus?

                        1. Hm. Was gibt:

                          select max( `products_price` * 1.05 ) as `max` from `xUmLObm6Zd_products`;
                          

                          2532.352935

                          und

                          select min( `products_price` * 1.05 ) as `min` from `xUmLObm6Zd_products`;
                          

                          0.000000

                          ich denke wie gerade geschrieben habe ich ein Platzproblem. Kann phpMyAdmin oder SQL direkt eine Zahl auf sagen wir maximal 3 Nachkommastellen runden? Dann sollte es wieder besser aussehen?

                          Vielleicht so?

                          SELECT ROUND(`products_price`,3) FROM `xUmLObm6Zd_products`
                          
                        2. Ganz andere Frage...

                          Geht denn

                          update 
                              xUmLObm6Zd_products 
                          set
                              products_price = ROUND( products_price * 1.05, 4 )
                          WHERE
                              permission_id  NOT IN (1379) 
                              AND products_price NOT NULL;
                          ~~~
                          
                          1. update xUmLObm6Zd_products set products_price = ROUND( products_price * 1.05, 4 ) WHERE permission_id NOT IN (1379)
                            

                            geht zwar und ich erhalte folgende Meldung

                            3182 Datensätze betroffen. (Die Abfrage dauerte 0.0136 Sekunden.)

                            Nur im Frontend sehe ich keine Preisänderung.

                            1. 3182 Datensätze betroffen. (Die Abfrage dauerte 0.0136 Sekunden.)

                              Wusste ich's doch: Hartnäckigkeit lohnt sich.

                              Nur im Frontend sehe ich keine Preisänderung.

                              Hm. Irgend ein Cache? Überzeuge Dich erst mal ob die Preise in der Datenbank geändert wurden. Kannst dazu einfach

                              select max( `products_price`) as `max` from `xUmLObm6Zd_products`;
                              

                              nochmal ausführen. War 2411.7647, sollte nun 2532.3529 ausspucken. Wenn das so ist → Handbuch oder Support Deines frontends. Stichworte Cache oder Redundanz in den Datentabellen.

                              1. Jetzt erhalte ich tatsächlich

                                2532.3529

                                das heißt also, das Update ging durch? Rufe ich allerdings einen Artikel auf, hat sich der Preis nicht geändert.

                                Wenn ich alle Artikel aufrufe erhalte ich

                                Zeige Datensätze 0 - 24 (3206 insgesamt, Die Abfrage dauerte 0.0014 Sekunden.)

                                Update meldete vorhin aber

                                3182 Datensätze betroffen. (Die Abfrage dauerte 0.0136 Sekunden.)

                                1. Jetzt erhalte ich tatsächlich

                                  2532.3529

                                  das heißt also, das Update ging durch?

                                  Das Update in der Tabelle und der Datenbank? Ja.

                                  Rufe ich allerdings einen Artikel auf, hat sich der Preis nicht geändert.

                                  Wo?

                                  Wenn ich alle Artikel aufrufe erhalte ich

                                  Zeige Datensätze 0 - 24 (3206 insgesamt, Die Abfrage dauerte 0.0014 Sekunden.)

                                  Wo?

                                  Update meldete vorhin aber

                                  3182 Datensätze betroffen. (Die Abfrage dauerte 0.0136 Sekunden.)

                                  Du hattest Datensätze gelöscht. Waren das zufällig 26 Datensätze?

                                  Ich vermute entweder Rendundanz, also dass Dein Frontend nicht diese Tabelle befragt, sondern eine andere, in welcher der Preis auch steht - die Du also auch noch ändern musst, oder Du hast einmal ein Testsystem und einmal das Produktionssystem, fragst also verschiedene Datenbanken.

                                  Oder Du hast irgendeinen Cache. Sind temporäre Tabellen vorhanden?

                                2. Hallo,

                                  sorry das Update ging schon die ganze Zeit durch. Ich bin doch so ein Esel :/ Ich könnte mich selbst in den Arsch treten. Ich hatte ein Produkt auf, welches in der Kategorie 1379 lag. Klar konnte sich der Preis nie ändern.

                                  Dennoch die Frage bleibt, in der Kategorie 1379 liegen 20 Datensätze. Nach dem Update hat man mir gesagt es wären 3182 und in der Artikel Tabelle liegen 3206. 3182+20 = 3202 wo sind dann die restlichen 4?

                                  1. Nach dem Update hat man mit gesagt es wären 3182 und in der Artikel Tabelle liegen 3206. 3182+20 = 3202 wo sind dann die restlichen 4?

                                    select min( `products_price` * 1.05 ) as `min` from xUmLObm6Zd_products`;`
                                    0.000000
                                    

                                    Nach dem Update hat "man" Dir gesagt es wären 3182 Zeilen geändert. Artikel mit einem Preis von 0.000000 wurden nicht geändert!

                                    Vermutlich haben also 4 Artikel einen Preis von 0.000000: SELECT COUNT () wird Dir das beweisen.

                                    1. Stimmt, an den habe ich überhaupt nicht mehr gedacht, auch die leere muss ich da noch mit drauf rechnen. DANKE für deine / eure Hilfe!

                                      1. Stimmt, an den habe ich überhaupt nicht mehr gedacht,

                                        Ja. Ich hatte heute zwei "schwere Geburten".

                                        Ich kenne aber Berufe, die einen Hochschulabschluss und sodann angeblich zwei Staatsexamen "mit Prädikat" benötigen. Die halten sich für die Elite der Eliten und merken weitaus gröberes als "ingesamt" vers. "geändert" nicht. Dedlfix zu liebe sage ich nicht, dass es Richter sind…

                                        1. Du und deine Richter 😃🤔

                            2. Tach!

                              Nur im Frontend sehe ich keine Preisänderung.

                              Bist du sicher, dass du in derselben Datenbank änderst und schaust?

                              dedlfix.

                              1. Hallo,

                                Bist du sicher, dass du in derselben Datenbank änderst und schaust?

                                ja, wenn ich z.B. den Preis händisch im Feld ändere und dann das Frontend aufrufe sehe ich auch den neuen Preis.

      2. Tach!

        Preise auf 205% des vorherigen Preises erhöhen, also mehr als verdoppeln?

        wie kommst du auf 205% 😯 *1.05 heißt doch 5%. Gebe ich bei Google 600 * 1.05 komme ich auf 630

        Du erhöhst den Preis um 5% und addierst das Ergebnis auf den Preis, also 100% + 105%.

        dedlfix.

    2. Preise auf 205% des vorherigen Preises erhöhen, also mehr als verdoppeln?

      Brexit, Mieten, Immobilien, ..., "Berliner" an Fasching