Aktive Flag-Spalte mit gleichzeitigen Updates
Posted: 15 Jan 2025, 18:03
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:
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
Dann füge ich den neuen Datensatz ein
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
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
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)
);
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=
Code: Select all
INSERT INTO entity (id,active) VALUES ('name',TRUE)
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)
);
Als Referenz verwende ich MySQL 8.0, bin aber gespannt, wie das mit anderen Datenbanken funktionieren würde