Replace

Werbung:
Das geht mit replace(), hier ein Beispiel in MSSQL, sollte in MySQL ähnlich sein:
Code:
UPDATE table SET spalte = replace(spalte,':','/')
Du kannst und solltest das ganze noch etwas verfeinern und möglichst eng eingrenzen, Beispiel:
Code:
UPDATE table SET spalte = replace(spalte,':in','/in') WHERE spalte LIKE '%:in%'

Eventuell bekommst du Probleme wenn die Spalte ein besonders großes Format hat und nicht einfach ein VARCHAR ist.
 
Das geht mit replace(), hier ein Beispiel in MSSQL, sollte in MySQL ähnlich sein:
Code:
UPDATE table SET spalte = replace(spalte,':','/')
Du kannst und solltest das ganze noch etwas verfeinern und möglichst eng eingrenzen, Beispiel:
Code:
UPDATE table SET spalte = replace(spalte,':in','/in') WHERE spalte LIKE '%:in%'

Eventuell bekommst du Probleme wenn die Spalte ein besonders großes Format hat und nicht einfach ein VARCHAR ist.
Leider grenzt du gar nicht mit deinem WHERE ein, da du mit LIKE arbeitest und dadurch einen FULL TABLE SCAN machst und keinen Index benutzen kannst.
Die erste Lösung genügt schon, da MySQL auch nicht schreibt wenn die Daten gleich geblieben sind
 
Leider grenzt du gar nicht mit deinem WHERE ein, da du mit LIKE arbeitest und dadurch einen FULL TABLE SCAN machst und keinen Index benutzen kannst.
Die erste Lösung genügt schon, da MySQL auch nicht schreibt wenn die Daten gleich geblieben sind
Das mit dem Full Table Scan scheint mir kein Problem und war mir nicht wichtig.

Mit WHERE wollte ich verhindern das Spalten ohne Änderung geschrieben werden. Bei MSSQL meine ich das das der Fall ist und das kann sich natürlich negativ z.B. auf Logging auswirken, daher erstmal diese völlig banale Einschränkung. Man könnte aber auch noch mehr Kriterien aus anderen Spalten rein bringen, vielleicht gibt es ein Attribut Sprache oder ähnliches.
 
Mit WHERE wollte ich verhindern das Spalten ohne Änderung geschrieben werden.
sehe ich auch so. In PG würde es passieren:

Code:
postgres=# create table demo(a int);
CREATE TABLE
postgres=# insert into demo values (1);
INSERT 0 1
postgres=# select ctid, a from demo;
 ctid  | a 
-------+---
 (0,1) | 1
(1 row)

postgres=# update demo set a = 1;
UPDATE 1
postgres=# select ctid, a from demo;
 ctid  | a 
-------+---
 (0,2) | 1
(1 row)

postgres=#

Man beachte die systeminterne Spalte ctid - sie ändert sich. Ich vermute dasselbe auch bei MySQL.
 
Werbung:
Moin,

sorry etwas späte Antwort.

MySQL schreibt NUR eine ROW zurück wenn sich Werte geändert haben, auch wenn z.B. eine
nicht angegebene Spalte mit ON UPDATE belegt ist.

Hier ein Beispiel:

Die Status Variable "Handler_update" ist ein interner Zähler der jede ROW zählt (bis auf tmp Tables)
die geändert wird.


Code:
mysql> DROP TABLE IF EXISTS myupdate;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> CREATE TABLE `myupdate` (
    ->   `myval` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
    ->   `myupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Query OK, 0 rows affected (0.17 sec)

mysql> INSERT INTO `myupdate` (`myval`)
    -> VALUES
    -> ('-- 12 --' ),
    -> ('-- 13 --' ),
    -> ('-- 14 --' ),
    -> ('-- 25 --' );
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SHOW STATUS LIKE 'Handler_update';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Handler_update | 12    |
+----------------+-------+
1 row in set (0.12 sec)

mysql> UPDATE myupdate set myval = REPLACE(myval,'1','9');
Query OK, 3 rows affected (0.00 sec)
Rows matched: 4  Changed: 3  Warnings: 0

mysql> SHOW STATUS LIKE 'Handler_update';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Handler_update | 15    |
+----------------+-------+
1 row in set (0.01 sec)

mysql> SELECT * FROM myupdate;
+----------+---------------------+
| myval    | myupdate            |
+----------+---------------------+
| -- 92 -- | 2023-08-10 07:58:42 |
| -- 93 -- | 2023-08-10 07:58:42 |
| -- 94 -- | 2023-08-10 07:58:42 |
| -- 25 -- | NULL                |
+----------+---------------------+
4 rows in set (0.00 sec)

mysql> UPDATE myupdate set myval = REPLACE(myval,'2','8');
Query OK, 2 rows affected (0.00 sec)
Rows matched: 4  Changed: 2  Warnings: 0

mysql> SHOW STATUS LIKE 'Handler_update';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| Handler_update | 17    |
+----------------+-------+
1 row in set (0.00 sec)

mysql> SELECT * FROM myupdate;
+----------+---------------------+
| myval    | myupdate            |
+----------+---------------------+
| -- 98 -- | 2023-08-10 07:58:42 |
| -- 93 -- | 2023-08-10 07:58:42 |
| -- 94 -- | 2023-08-10 07:58:42 |
| -- 85 -- | 2023-08-10 07:58:42 |
+----------+---------------------+
4 rows in set (0.00 sec)

mysql>
 
Zurück
Oben