Neue Spalten in einer Tabelle basierend auf neuen Einträgen in einer anderen Tabelle in mysql hinzufügen

8

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.

%Vor%

Ich hoffe, dass jemand mir helfen kann, da ich kein Experte für SQL bin! Vielen Dank im Voraus.

    
Ansjovis86 22.03.2017, 20:01
quelle

5 Antworten

8

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.

    
Rick James 05.04.2017 21:37
quelle
3

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.

    
Yuri G 05.04.2017 22:33
quelle
3

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):

%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.

    
cha 05.04.2017 02:11
quelle
2

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).

    
A Hettinger 10.04.2017 23:17
quelle
2
___ qstnhdr ___ Neue Spalten in einer Tabelle basierend auf neuen Einträgen in einer anderen Tabelle in mysql hinzufügen ___ answer43242729 ___

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.

    
___ qstntxt ___

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.

    
___ tag123mysql ___ MySQL ist ein freies, relationales Datenbank-Managementsystem (RDBMS), das die strukturierte Abfragesprache (SQL) verwendet. Verwenden Sie dieses Tag NICHT für andere DBs wie SQL Server, SQLite usw. Dies sind verschiedene DBs, die alle SQL verwenden, um die Daten zu verwalten. ___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ antwort43343147 ___

Sie können beim Einfügen neuer Einträge in eine andere Tabelle einen Trigger setzen. Wie -

%Vor%     
___ answer43334328 ___

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).

    
___ answer43220658 ___

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.

    
___ answer43242075 ___

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.

    
___
Zigri2612 11.04.2017 10:18
quelle

Tags und Links