Aktive Flag-Spalte mit gleichzeitigen UpdatesMySql

MySQL DBMS-Forum
Guest
 Aktive Flag-Spalte mit gleichzeitigen Updates

Post by Guest »

Ich habe es also mit einem Projekt zu tun, bei dem wir Entitäten haben, die einen Namen haben, und während mehrere Entitäten denselben Namen haben können, kann jeweils nur eine dieser Entitäten aktiv sein. Daher müssen für jede Aktualisierung/Einfügung, wenn die neue/aktualisierte Entität active = TRUE hat, alle anderen Einträge mit diesem Namen active = FALSE haben.
My Das Problem besteht darin, dass es, wenn zwei Einfügungen gleichzeitig erfolgen, Fälle zu geben scheint, in denen zwei Einträge mit dem gleichen Namen als active = TRUE enden. Ich schätze, weil bei der Überprüfung der Datenbank auf Einträge mit diesem Namen der Wert „false“ gesetzt wird , keine der Zeilen vorhanden ist, und so das Programm kommt zu dem Schluss, dass beide Einträge trotz des gleichen Namens active = TRUE haben dürfen.
Um ein Beispiel im Pseudocode zu geben:

Code: Select all

CREATE TABLE entity (
id INT(11),
name VARCHAR(50),
active bit(1)
);
Wenn ich einen neuen Datensatz mit dem Namen „Name“ erhalte, mache ich Folgendes:
SELECT id FROM entity WHERE name = 'name' AND active = TRUE;
I Holen Sie sich die ID für dieses Objekt, nennen wir es, und aktualisiere dann für diesen Datensatz

Code: Select all

UPDATE entity SET active=FALSE WHERE id=
Dann füge ich den neuen Datensatz ein

Code: Select all

INSERT INTO entity (id,active) VALUES ('name',TRUE)
Soweit ich das beurteilen kann, kann dieses Setup nicht funktionieren, es sei denn, ich sperre irgendwie die gesamte Tabelle für jede Einfügung/Aktualisierung, um gleichzeitige Aktualisierungen zu verhindern.
Die Alternative, an die ich denke, besteht darin, keine aktive Spalte zu haben, sondern eine zweite Tabelle wie

Code: Select all

CREATE TABLE active_entity (
name VARCHAR(50),
active_record INT(11)
);
wobei active_record ein Fremdschlüssel ist, der zur Entitätstabelle geht, und wenn ich aktive Datensätze benötige, führe einfach einen Join durch. Gibt es eine Möglichkeit, dies zu vermeiden?
Als Referenz verwende ich MySQL 8.0, bin aber gespannt, wie das mit anderen Datenbanken funktionieren würde

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post