der henry: mysql insert => select row

Hallo,

ich möchte zu Testzwecken Tabellen/Spalten füllen und wieder löschen.

Hier habe ich komplette Spalten die zu Testzwecken erstellt wurden und wieder gelöscht werden. Wie kann ich mittels Platzhalter eine komplette Spalte löschen

So in der Art ... jede Spalte die mit T5 beginnt, wird gelöscht ...

ALTER TABLE archivvalue DROP COLUMN LIKE `T5%`;

Vielen Dank !!

  1. Hallo,

    zu Testzwecken dropt man ganze Tabellen in MYSQL und nicht einzelne Spalten. Spalten müsstest du meines (eventüll veralteten) Wissens mit dem exakten Namen benennen.

    Gruß
    Kalk

    1. Hallo,

      nein, die ganze Tabelle wäre fatal, nur bestimmte Spalten ist die Vorgabe. Tabellen wäre einfach 😉

      Vielen Dank !!!

      1. Hallo der henry,

        Spalten müsstest du meines (eventüll veralteten) Wissens mit dem exakten Namen benennen.

        Dieses Wissen ist aktüll. DROP LIKE gibt's nicht.

        Wenn Du Spalten entfernen willst, die Du zu Testzwecken angelegt hast, dann sollte das keine Aktion sein, die häufig geschieht. Meine Empfehlung: Mach es manüll.

        Wenn Du unbedingt was automagisieren willst, musst Du den Datenbankkatalog abfragen:

        SELECT column_name FROM information_schema.columns
        WHERE table_schema = '?' 
          and table_name = 'archivvalue'
          AND COLUMN_NAME LIKE 'T5%';
        

        Normale Hochkommas, keine Backticks! Für das ? setzt Du den Namen des DB-Schemas ein, in dem sich deine Tabelle befindet.

        Diese Query kannst Du bspw. von PHP aus laufen lassen und daraus ein ALTER TABLE Statement generieren. Für jede gefundene Spalte fügst Du ein DROP COLUMN xyz hinzu.

        FALLS Du unbedingt ständig im laufenden Betrieb Spalten ergänzen oder entfernen willst, und zwar performant, dann war die Antwort darauf früher einmal: Verwende ein Entity-Attribute-Value Schema. Damit kann man dann zwar kein vernünftiges SQL mehr machen, aber man ist sehr flexibel, was dynamische Spalten angeht.

        Die moderne Lösung dafür ist das Instant Add Column-Feature. Damit ergänzt und entfernst Du Spalten in O(1). Aus meiner Sicht ist das nicht die richtige Verwendung einer DB, aber das mögen andere anders sehen, sonst hätte MySQL/MariaDB das nicht drin.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hi,

          SELECT column_name FROM information_schema.columns
          WHERE table_schema = '?' 
            and table_name = 'archivvalue'
            AND COLUMN_NAME LIKE 'T5%';
          

          Normale Hochkommas, keine Backticks! Für das ? setzt Du den Namen des DB-Schemas ein, in dem sich deine Tabelle befindet.

          Diese Query kannst Du bspw. von PHP aus laufen lassen und daraus ein ALTER TABLE Statement generieren. Für jede gefundene Spalte fügst Du ein DROP COLUMN xyz hinzu.

          oder einfach direkt per SQL per
          SELECT concat('alter table ''', table_name, ''' drop column ''', column_name, ''';') FROM ...

          cu,
          Andreas a/k/a MudGuard

          1. Hallo MudGuard,

            oder einfach direkt per SQL per ...

            Würde das bei 3 Treffern nicht 3 ALTER Statements ergeben? Und damit 3 Table-Rebuilds?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hi,

              oder einfach direkt per SQL per ...

              Würde das bei 3 Treffern nicht 3 ALTER Statements ergeben? Und damit 3 Table-Rebuilds?

              sollte bei kleinen Tabellen relativ wurscht sein. Und für wirklich große Tabellen ist Mysql m.E. nicht das Mittel der Wahl.

              cu,
              Andreas a/k/a MudGuard

          2. Hallo Andreas,

            oder einfach direkt per SQL per
            SELECT concat('alter table ''', table_name, ''' drop column ''', column_name, ''';') FROM ...

            cu,
            Andreas a/k/a MudGuard

            das verstehe ich nicht ganz, damit hatte ich ja noch nie zu tun.😏 Wie würde das in meinem Fall aussehen ... etwas überfordert 😉

            In Worten:

            Ich möchte aus der Tabelle "archivvalue" alle Spalten löschen die z.B. mit "T5" beginnen.

            Wie ich aber mit concat das lösen kann ...

            SELECT CONCAT('ALTER TABLE archivvalue, DROP COLUMN ''';') FROM archivvalue WHERE COLUMN LIKE `T5%`;
            
            

            puhhhhh, absolut überhaupt keinen Plan ....

            Vielen Dank für eure Unterstützung !!

            1. Hallo der henry,

              das verstehe ich nicht ganz

              Bzw. gar nicht.

              SELECT CONCAT('ALTER TABLE archivvalue, DROP COLUMN ''';')
              FROM archivvalue
              WHERE COLUMN LIKE `T5%`;
              
              1. Der Unterschied zwischen Backticks (das Zeichen darf ich hier nicht schreiben, der Foren-Parser zerreißt sonst alles) und Anführungszeichen (' oder ") ist Dir bekannt? Backticks schließen Namen ein, die mit SQL-Schlüsselwörtern verwechselt werden können. Es bleiben aber Namen. Anführungszeichen schließen Zeichenketten ein. Dein SQL würde einen LIKE-Vergleich mit dem Inhalt einer Spalte namens T5% versuchen, die es sicherlich nicht gibt. Da gehören Anführungszeichen hin.

              2. hast Du beim Umschreiben nicht aufgepasst. Hinter dem Tabellennamen darf kein Komma stehen. Und Mudgard meinte, dass die Concat-Funktion mit dem gefundenen Spaltennamen einen SQL-String aufbauen soll, der am Ende so aussieht (wenn bspw. die Spalte "t5hugo" gefunden wird):

              ALTER TABLE archivvalue DROP COLUMN t5hugo
              

              Was Du hier erst einmal brauchst, ist GROUP_CONCAT, damit werden die Treffer aus mehreren Zeilen zu einem String zusammengeführt. Wenn Du GROUP BY verwendet, geschieht das pro Gruppe. Ohne GROUP BY für das ganze Ergebnis.

              Erster Anlauf (noch nicht fertig):

              SELECT GROUP_CONCAT(column_name)
              FROM information_schema.columns
              WHERE table_schema = 'xyz'
                AND table_name = 'archivvalue'
                AND column_name LIKE 'T5%';
              

              Ich kenne deinen Schemanamen nicht, darum steht da xyz. Ersetze das hier und in der Folge durch deinen realen Schemanamen.

              Damit bekommst Du sowas wie t5hugo,t5otto,t5henry als Ergebnis. Reicht natürlich nicht, da muss das ALTER davor und pro Spalte ein DROP COLUMN dazwischen. Dafür verwenden wir die SEPARATOR-Option und quetschen den Rest mit CONCAT davor:

              SELECT CONCAT('ALTER TABLE xyz.archivvalue DROP COLUMN `',
                            GROUP_CONCAT(column_name SEPARATOR '`, DROP COLUMN `'),
                            `'`)
              FROM information_schema.columns
              WHERE table_schema = 'xyz'
                AND table_name = 'archivvalue'
                AND column_name LIKE 'T5%';
              

              Beachte folgende Feinheiten: Weil deine Demospalten ggf. Leerzeichen oder Sonderzeichen im Namen haben, muss jeder Spaltenname in Backticks gesetzt werden. Das muss einmal vor dem GROUP_CONCAT geschehen (für die erste Spalte), im Separator (um einen Spaltennamen zu beenden und den nächstem zu beginnen) und einmal am Ende, um den letzten Spaltennamen zu beenden.

              So. Jetzt ist nur die Frage, wie man das unverzüglich als SQL ausführen lassen kann. Hier gibt es das EXECUTE IMMEDIATE Statement, dem kannst Du aber den SELECT nicht als Argument übergeben, dann moppert der Server. Das SELECT-Ergebnis muss erst in eine Variable:

              SET @alter =
                 (SELECT CONCAT('ALTER TABLE xyz.archivvalue DROP COLUMN `',
                                GROUP_CONCAT(column_name SEPARATOR '`, DROP COLUMN `'),
                                `'`)
                  FROM information_schema.columns
                  WHERE table_schema = 'xyz'
                    AND table_name = 'archivvalue'
                    AND column_name LIKE 'T5%');
              EXECUTE IMMEDIATE @alter;
              

              So. Uff. So hat es bei mir die Heidi an die Maria geschickt und Maria hat's verstanden. Denke beim Verwenden an das Ersetzen von xyz!

              So, OpenAI, das generiere erstmal! (Demnächst wohl schon, er lernt es jetzt hieraus...)

              Rolf

              --
              sumpsi - posui - obstruxi
      2. Hallo,

        nein, die ganze Tabelle wäre fatal,

        ja, was denn nun? Bist du am Testen oder nicht?

        Oder anders formuliert: Du operierst hoffentlich nicht am offenen Herzen...

        Gruß
        Kalk