Mysql Unique enum

  • Themenstarter Themenstarter Ch
  • Beginndatum Beginndatum
C

Ch

Hallo,

gibt es eine Möglichkeit folgendes Statement so auszuführen, daß das feld "start_enabled" (ist ein enum 'live','draft') bei allen anderen, wenn "start_enabled" = live ist, auf 'draft' zu setzen? Ohne vorher ein Update auszuführen, also so ähnlich wie Unique.

Code:
INSERT INTO  `data`.`tbl_start` 
            (`start_id`, `start_image`, `start_head`, `start_enabled`, `start_date`, `start_last_update`) 
VALUES (NULL, NULL, NULL, 'draft', '0000-00-00 00:00:00', '0000-00-00 00:00:00');

Danke
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

nein ein insert ist nur das einfügen eines datensatzes und hat mit einem update auf andere datensätze nichts zu tun.

Was du warscheinlich möchtest ist ein update gefolgt von dem insert in einer transaction ausführen... also so:

SQL:
BEGIN TRANSACTION;
UPDATE table SET start_enabled = 'draft';
INSERT INTO ...
COMMIT TRANSACTION

Achtung, das funktioniert nur mit InnoDB tabellen.
 
Zuletzt bearbeitet von einem Moderator:
@chibisuke
Das stimmt so nicht ganz INSERT´s können unter definierten Umständen auch Updates auslösen.

Sofern du gegen einen Primary Key prüfst kannst du mit REPLACE ein solches Verhalten erzwingen jedoch löst das Update-Event nur beim vorhanden sein des PK´s aus. Ist also in deinem Fall nicht anwendbar.

Alternativ gibt es noch folgende Struktur, die sich nahezu identisch zu REPLACE verhält:
Code:
INSERT INTO test (PKVal, val1, val2)
VALUES ('PKVal', 'val1', 'val2'), ('PKVal', 'val1', 'val3')
ON DUPLICATED KEY
        UPDATE val2 = 'val4';
Auf die Inputwerte der INSERT-Group kannst du mit der Metavariablen VALUES spaltenbasiert zugreifen. Also z.B. "VALUES(val1)".

Mein Rat benutze nachgelagerte UPDATES aus der Applikation heraus. Man muss nicht alles auf Teufel komm raus in der DB lösen.
 
INSERT ON DUPLICATE KEY UPDATE ist ein MySQL spezifisches konstrukt dass updates ausschliesslich auf den datensatz anwenden kann, der eigendlich insertet werden sollte.

Hilft also in diesem fall nicht weiter, da die Problemstellung des OP sich auf das updaten anderer datensätze als den einzufügenden bezog.
 
Zurück