Angesichts der folgenden Tabelle:
id | value
--------------
1 6
2 70
Gibt es eine Möglichkeit, eine Spalte hinzuzufügen, die automatisch basierend auf einer anderen Spalte in derselben Tabelle berechnet wird? Wie eine ANSICHT, aber Teil derselben Tabelle. Als Beispiel calculated
wäre die Hälfte von value
. Calculated
sollte bei value
Änderungen automatisch aktualisiert werden , genau wie eine ANSICHT.
Das Ergebnis wäre:
id | value | calculated
-----------------------
1 6 3
2 70 35
Antworten:
Generated Column ist einer der guten Ansätze für die MySql-Version 5.7.6 und höher.
Es gibt zwei Arten von generierten Spalten:
Beide Typen können NICHT NULL-Einschränkungen haben, aber nur eine gespeicherte generierte Spalte kann Teil eines Index sein.
Für den aktuellen Fall verwenden wir eine gespeicherte generierte Spalte. Zur Implementierung habe ich berücksichtigt, dass beide für die Berechnung erforderlichen Werte in der Tabelle vorhanden sind
CREATE TABLE order_details (price DOUBLE, quantity INT, amount DOUBLE AS (price * quantity)); INSERT INTO order_details (price, quantity) VALUES(100,1),(300,4),(60,8);
Der Betrag wird automatisch in der Tabelle angezeigt und Sie können direkt darauf zugreifen. Beachten Sie außerdem, dass der Betrag bei jeder Aktualisierung einer der Spalten ebenfalls aktualisiert wird.
quelle
Wenn es sich um eine Auswahl handelt, können Sie Folgendes tun:
SELECT id, value, (value/2) AS calculated FROM mytable
Andernfalls können Sie auch zuerst die Tabelle ändern, um die fehlende Spalte hinzuzufügen, und dann eine UPDATE-Abfrage ausführen, um die Werte für die neue Spalte wie folgt zu berechnen:
UPDATE mytable SET calculated = value/2;
Wenn es automatisch sein muss und Ihre MySQL-Version dies zulässt, können Sie es mit Triggern versuchen
quelle
calculated
Spalte verwenden, um weitere Berechnungen in derselben Abfrage auszuführen? Wie (calculated
* 2) ASdouble_calculated
?MySQL 5.7 unterstützt berechnete Spalten. Sie nennen es "Generated Columns" und die Syntax ist etwas seltsam, aber sie unterstützt die gleichen Optionen, die ich in anderen Datenbanken sehe.
https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns
quelle
@ krteks Antwort ist in die richtige Richtung, hat aber ein paar Probleme.
Die schlechte Nachricht ist, dass die Verwendung von UPDATE in einem Trigger für dieselbe Tabelle nicht funktioniert. Die gute Nachricht ist, dass es nicht notwendig ist; Es gibt ein NEUES Objekt, an dem Sie arbeiten können, bevor der Tisch überhaupt berührt wird.
Der Auslöser wird:
CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END;
Beachten Sie auch, dass BEGIN ... END; Die Syntax muss mit einem anderen Trennzeichen analysiert werden. Der ganze Schebang wird:
DELIMITER | CREATE TRIGGER halfcolumn_insert BEFORE INSERT ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END; | CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table FOR EACH ROW BEGIN SET NEW.calculated = NEW.value/2; END; | DELIMITER ;
quelle
Sie können generierte Spalten aus MYSQL 5.7 verwenden.
Anwendungsbeispiel:
ALTER TABLE tbl_test ADD COLUMN calc_val INT GENERATED ALWAYS AS (((`column1` - 1) * 16) + `column2`) STORED;
VIRTUELL / GESPEICHERT
quelle
Wenn Sie Ihrer Tabelle eine Spalte hinzufügen möchten, die automatisch auf die Hälfte einer anderen Spalte aktualisiert wird, können Sie dies mit einem Trigger tun.
Aber ich denke, die bereits vorgeschlagene Antwort ist ein besserer Weg, dies zu tun.
Trockencodierter Auslöser:
CREATE TRIGGER halfcolumn_insert AFTER INSERT ON table FOR EACH ROW BEGIN UPDATE table SET calculated = value / 2 WHERE id = NEW.id; END; CREATE TRIGGER halfcolumn_update AFTER UPDATE ON table FOR EACH ROW BEGIN UPDATE table SET calculated = value / 2 WHERE id = NEW.id; END;
Ich glaube nicht, dass Sie nur einen Auslöser setzen können, da das Ereignis, auf das wir reagieren müssen, unterschiedlich ist.
quelle
Ich hoffe, das hilft immer noch jemandem, so viele Leute wie möglich zu diesem Artikel kommen. Wenn Sie eine berechnete Spalte benötigen, können Sie Ihre gewünschten Spalten in einer Ansicht anzeigen. Speichern Sie nicht nur Daten oder überladen Sie die Leistung mit Triggern. Stellen Sie einfach die Daten bereit, die Sie bereits in einer Ansicht formatiert / berechnet haben.
Hoffe das hilft...
quelle