Sie können beim Einfügen neuer Einträge in eine andere Tabelle einen Trigger setzen. Wie -
%Vor% Ich habe 2 Tabellen: Sitzungen und Aufgaben. Diese Zuordnungstabelle hat eine Spalte namens scriptname
mit Strings als Werten. Die Sitzungstabelle hat die Spaltennamen scriptname
+ die Spalten id
, uid
, timein
und timeout
. Wenn ich neue Zuweisungen zu Zuweisungen hinzufüge, erhalte ich neue Werte in der Spalte scriptname
, die ich als neue Spalten zu Sitzungen mit Standardwerten von 0 hinzufügen möchte. Wie mache ich das?
Was ich momentan mache, ist die Tabelle zu löschen und eine neue Tabelle basierend auf der Spalte scriptname
zu erstellen. Das Problem ist natürlich, dass ich alle meine Daten verliere.
Ich hoffe, dass jemand mir helfen kann, da ich kein Experte für SQL bin! Vielen Dank im Voraus.
Ziehen Sie stattdessen Zeilen zu einer Tabelle hinzu. Dann später "pivot", um Spalten zu machen, während die Ausgabe angezeigt wird.
Das Hinzufügen von Spalten ist ziemlich ungeschickt, wie Sie feststellen. Wenn Sie zu viele Spalten hinzufügen, werden Sie irgendwann ein Limit erreichen. Das Hinzufügen von Zeilen ist praktisch unbegrenzt.
Das Drehen wird in diesem Forum oft diskutiert, daher werde ich diese Diskussionen hier nicht wiederholen.
Schwaches Datenmodell hier. Es ist nicht für RDBMS - dort werden Sie die Beschränkungen für Ihr Dataset durch Beziehungen erzwingen.
In Ihrem Fall beispielsweise, indem Sie scriptname
zu einem Fremdschlüssel in Ihrer Tabelle sessions
machen.
Daher haben Sie mehrere Datensätze in sessions
table je nach dem, was Sie als einen Datensatz Ihres Typs betrachten, von denen jeder 1 scriptename-Wert (der für den Spaltennamen in Ihrem Modell steht) und der zugehörige Wert (der Feldwert in Ihrem Tabelle).
Dann können Sie "rotieren" und diese zwei Spalten zu einer Reihe auf der Klientenseite zusammenbauen.
Andernfalls, wenn Sie fest entschlossen sind, diese denormierte nicht-rigide Datenstruktur um jeden Preis beizubehalten, sollten Sie sich besser für eine spaltenorientierte / multimodale Datenbank wie Apache Cassandra entscheiden. Dort können Sie Ihre Spaltenfamilie / Tabellenstruktur direkt ändern, ohne dass Sie anhalten / ablegen / neu erstellen / erneut ausführen müssen.
Sie müssen die Liste der neu hinzugefügten Spalten irgendwie kennen. ZB haben Sie möglicherweise eine Spalte mit dem Namen date_added
, die Sie beim Hinzufügen der neuen Sitzung aufgezeichnet haben.
Wenn Sie keine solche Spalte haben, können Sie die Liste der Spalten von INFORMATION_SCHEMA.COLUMNS abrufen. Dann brauchen Sie nur ein ALTER TABLE
-Skript wie dieses zu erstellen (das fügt der Tabelle für die im April hinzugefügten Sitzungen neue Spalten hinzu):
Allerdings muss ich Ihnen sagen, dass Sie die Art und Weise, wie Sie Ihre Daten speichern, neu gestalten müssen. Die Art, wie Sie es speichern, ist nicht optimal. Sie müssen die Sitzungen in Zeilen speichern, nicht in der Spalte, wie Sie es tun. Wenn Sie die Daten auf diese Weise darstellen müssen, können Sie eine Abfrage erstellen, um die Daten zu pivotieren.
Wie andere bereits gesagt haben, ist die dynamische Erstellung einer ständig wachsenden Liste von Spalten eindeutig nicht das, was Sie tun sollten. SQL ist dafür nicht gedacht.
Wo ich auf der Grundlage der begrenzten Informationen darüber, wie Sie diese verwenden, hätte ich eine dritte Tabelle (mit zwei Spalten: "Skriptname" und "Wert"), die mit der Sitzungstabelle verknüpft werden könnte. Auf diese Weise können Sie eine beliebige Anzahl von Aufgaben pro Sitzung haben (was wie Ihr Ziel klingt).
Schwaches Datenmodell hier. Es ist nicht für RDBMS - dort werden Sie die Beschränkungen für Ihr Dataset durch Beziehungen erzwingen.
In Ihrem Fall beispielsweise, indem Sie %code% zu einem Fremdschlüssel in Ihrer Tabelle %code% machen. Daher haben Sie mehrere Datensätze in %code% table je nach dem, was Sie als einen Datensatz Ihres Typs betrachten, von denen jeder 1 scriptename-Wert (der für den Spaltennamen in Ihrem Modell steht) und der zugehörige Wert (der Feldwert in Ihrem Tabelle). Dann können Sie "rotieren" und diese zwei Spalten zu einer Reihe auf der Klientenseite zusammenbauen.
Andernfalls, wenn Sie fest entschlossen sind, diese denormierte nicht-rigide Datenstruktur um jeden Preis beizubehalten, sollten Sie sich besser für eine spaltenorientierte / multimodale Datenbank wie Apache Cassandra entscheiden. Dort können Sie Ihre Spaltenfamilie / Tabellenstruktur direkt ändern, ohne dass Sie anhalten / ablegen / neu erstellen / erneut ausführen müssen.
Ich habe 2 Tabellen: Sitzungen und Aufgaben. Diese Zuordnungstabelle hat eine Spalte namens %code% mit Strings als Werten. Die Sitzungstabelle hat die Spaltennamen %code% + die Spalten %code% , %code% , %code% und %code% . Wenn ich neue Zuweisungen zu Zuweisungen hinzufüge, erhalte ich neue Werte in der Spalte %code% , die ich als neue Spalten zu Sitzungen mit Standardwerten von 0 hinzufügen möchte. Wie mache ich das?
Was ich momentan mache, ist die Tabelle zu löschen und eine neue Tabelle basierend auf der Spalte %code% zu erstellen. Das Problem ist natürlich, dass ich alle meine Daten verliere.
%Vor%Ich hoffe, dass jemand mir helfen kann, da ich kein Experte für SQL bin! Vielen Dank im Voraus.
Sie können beim Einfügen neuer Einträge in eine andere Tabelle einen Trigger setzen. Wie -
%Vor%Wie andere bereits gesagt haben, ist die dynamische Erstellung einer ständig wachsenden Liste von Spalten eindeutig nicht das, was Sie tun sollten. SQL ist dafür nicht gedacht.
Wo ich auf der Grundlage der begrenzten Informationen darüber, wie Sie diese verwenden, hätte ich eine dritte Tabelle (mit zwei Spalten: "Skriptname" und "Wert"), die mit der Sitzungstabelle verknüpft werden könnte. Auf diese Weise können Sie eine beliebige Anzahl von Aufgaben pro Sitzung haben (was wie Ihr Ziel klingt).
Sie müssen die Liste der neu hinzugefügten Spalten irgendwie kennen. ZB haben Sie möglicherweise eine Spalte mit dem Namen %code% , die Sie beim Hinzufügen der neuen Sitzung aufgezeichnet haben.
Wenn Sie keine solche Spalte haben, können Sie die Liste der Spalten von INFORMATION_SCHEMA.COLUMNS abrufen. Dann brauchen Sie nur ein %code% -Skript wie dieses zu erstellen (das fügt der Tabelle für die im April hinzugefügten Sitzungen neue Spalten hinzu):
%Vor%Allerdings muss ich Ihnen sagen, dass Sie die Art und Weise, wie Sie Ihre Daten speichern, neu gestalten müssen. Die Art, wie Sie es speichern, ist nicht optimal. Sie müssen die Sitzungen in Zeilen speichern, nicht in der Spalte, wie Sie es tun. Wenn Sie die Daten auf diese Weise darstellen müssen, können Sie eine Abfrage erstellen, um die Daten zu pivotieren.
Ziehen Sie stattdessen Zeilen zu einer Tabelle hinzu. Dann später "pivot", um Spalten zu machen, während die Ausgabe angezeigt wird.
Das Hinzufügen von Spalten ist ziemlich ungeschickt, wie Sie feststellen. Wenn Sie zu viele Spalten hinzufügen, werden Sie irgendwann ein Limit erreichen. Das Hinzufügen von Zeilen ist praktisch unbegrenzt.
Das Drehen wird in diesem Forum oft diskutiert, daher werde ich diese Diskussionen hier nicht wiederholen.