Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite Spalte Typ ändern (https://www.delphipraxis.net/212489-sqlite-spalte-typ-aendern.html)

Peter-Pascal 16. Feb 2023 21:01

Datenbank: SQLite • Version: 3.0 • Zugriff über: Firedac

SQLite Spalte Typ ändern
 
Hallo,

wenn man gerade eben was machen will ...

Ich habe bei einer SQLite Tabelle Spalten hinzugefügt, aber den Typ vergessen anzugeben. Besteht irgendeine Möglichkeit, den Typ nachträglich anzugeben?

Ich habe bisher nichts gefunden.
Den kam ich auf die Idee ganz einfach die Spalten zu löschen und neu einzugeben, aber das funktioniert auch nicht.
Er nimmt den Befehl:

alter table KontoRahmen drop column VorschlagPersGes

Es kommt immer ERROR: near "drop": syntax error.

Da die Tabelle bereits gefüllt ist, kommt Tabelle löschen nicht so ohne Weiteres infrage.

Danke für die Hilfe.

Gruß Peter

zeras 16. Feb 2023 21:06

AW: SQLite Spalte Typ ändern
 
Nimm doch den SQLite Browser als externes Tool. Damit sollten dir alle Möglichkeiten offenstehen.

peer81 16. Feb 2023 21:18

AW: SQLite Spalte Typ ändern
 
SQLite unterstützt nicht alle ALTER TABLE Optionen.

Wenn du es über Befehle machen willst, dann so:
- Tabelle umbenennen
- Tabelle neu erstellen
CREATE TABLE tabellenname AS SELECT spalte1, spalte2, spalte3 FROM tabellenname_old;

die Spalte, die du löschen willst, lässt du bei dem SELECT weg.

Oder wie eben schon geschrieben, ein Tool dafür verwenden.

Peter-Pascal 16. Feb 2023 21:57

AW: SQLite Spalte Typ ändern
 
Danke Matthias und Peer81 für die schnellen Antworten.

Ich habe das Tool genommen. Wenn Du mich jetzt fragst, warum nicht sofort? Ich wusste gar nicht, dass es dieses Tool gibt. Vor einiger Zeit habe ich nach sowas gesucht und mich dann immer mit Delphi Bordmittel geholfen. Das meiste kann man ohne hin mit SQL erledigen. Wie jetzt auch im DB Browser. Auch hier hatte ich SQL-Statements eingesetzt. Warum drop im DB Browser funktioniert, aber bei TFDQuery nicht, erschließt sich mir nicht.

Peer81, wenn ich wie Du beschrieben hast die Tabelle neu anlege mit "CREATE TABLE tabellenname AS SELECT spalte1, spalte2, spalte3 FROM tabellenname_old;" dann werden die Felder aber nicht mit kopiert, oder doch?

Aber trotzdem gut zu wissen, dass dies funktioniert.

Vielen Dank noch mal.

Gruß Peter

anse 17. Feb 2023 05:56

AW: SQLite Spalte Typ ändern
 
Gibt es nach deiner TFDQuery eine Fehlermeldung?
Vielleicht hast du ja Leerzeichen oder andere non-identifier-Zeichen in deinen Spalten- oder Tabellen-Namen, in dem Fall musst du die Spalten mit Anführungszeichen quoten:

Code:
CREATE TABLE "tabellen name" AS SELECT spalte1, "spalte 3" FROM tabellenname_old;
Das ganze geht übrigens auch mit HeidiSQL. Hier gibt es einen "Copy table" Dialog, bei dem du einzelne Spalten abwählen kannst.

Peter-Pascal 17. Feb 2023 07:30

AW: SQLite Spalte Typ ändern
 
Hallo Anse,

ja, auch bei TFDQuery kommt eine Fehlermeldung: Error: near by drop

Die Möglichkeit eines falschen Zeichens kann ich nicht ausschließen. Nur wenn ich den Befehl mit add mache, klappt es, bei drop, modify und ähnlichem funktioniert es nicht. Auch Anführungszeichen hatte ich schon gesetzt.

Seit einiger Zeit verändere mit TFDQuery die Datenbank. Bis auf drop funktioniert es.

Gruß Peter

Delphi.Narium 17. Feb 2023 08:15

AW: SQLite Spalte Typ ändern
 
Bei SQL gibt es einmal die Norm und einmal die Implementierung. Und die passen nicht immer zwingend zusammen ;-)

Bei manchen Datenbanken heißt es
SQL-Code:
alter table tabellenname drop column spaltenname

bei anderen
SQL-Code:
alter table tabellenname drop spaltenname
.

Funktioniert die zweite Variante bei SQLite?

Peter-Pascal 17. Feb 2023 08:36

AW: SQLite Spalte Typ ändern
 
Hallo Delphi.Narium,

mit TFDQuery funktionierte keine Variante. Wobei ich jetzt nicht behaupten möchte alle Varianten ausprobiert zu haben, und jedes Mal auch die richtige Syntax verwendet zu haben.
Dagegen hat mit dem Tool fast jede Variante funktioniert. Es hat schneller gelöscht, als ich auf Enter drücken konnte. Glücklicherweise fragt es am Ende, ob es die Veränderungen übernehmen soll. Das finde ich gut.

Kann es sein, dass der Befehlssatz von FireDac restriktiver ist als der von SQLite selbst?

Gruß Peter

Der schöne Günther 17. Feb 2023 08:42

AW: SQLite Spalte Typ ändern
 
Ich bin in FireDAC und Datenbanken generell jetzt nicht so fit, aber ich hätte gedacht dass Queries für Abfrage und Manipulation (Data Query Language, Data Manipulation Language) gedacht ist, aber nicht für DDL welches die Struktur von Tabellen verändert.

Wenn man das möchte (dazu zählt z.B. auch das Anlagen und Löschen von Tabellen und Schemata) führt man die Query direkt über die
Delphi-Quellcode:
TFdConnection
aus.

Wird hier auch so gezeigt:

Ausführen von Anweisungen (FireDAC)

Peter-Pascal 17. Feb 2023 09:21

AW: SQLite Spalte Typ ändern
 
Grundsätzlich hast Du recht. Der TFDQuery öffnet im Entwurfsmodus auf Doppelklick einen Abfrageeditor, der SQL-Anweisungen ausführt. Der Editor unterscheidet nicht zwischen DML und DDL. Wobei es möglicherweise doch der Grund ist, dass Spalten angelegt werden können, aber nicht gelöscht. Vielleicht eine Erklärung.

jobo 19. Feb 2023 15:10

AW: SQLite Spalte Typ ändern
 
Es gibt ja sowas wie Dokumentation:
https://www.sqlite.org/lang_altertable.html
alter table .. drop column sollte also funktionieren.

Dagegen gibt es viele Stellen im Netz, die (noch) davon sprechen, dass drop column in SQLite nicht möglich ist.
Vielleicht ist es eine Frage der Version und die Drop Funktion ist relativ neu.

Das Tool sollte dabei relativ egal sein. Außer ein Programmierer hat sich in einem SQLite Tool die Mühe gemacht, die fehlende Funktion mit Workarounds nachzubauen, wie schon beschrieben.
- create copyTabelle as Select <ohneZuLöschendeSpalte> from originalTabelle
- drop originalTabelle
- rename copyTabelle
Was natürlich nur die reine Datenmigration erledigt, keine Constraints, Schlüssel, Indizierung, ...

Peter-Pascal 19. Feb 2023 15:58

AW: SQLite Spalte Typ ändern
 
Danke Jobo für den Hinweis.

Hier wird genau der Fehler erwähnt, den ich auch bekommen habe. Allerdings ist der Beitrag bereits über 11 Jahre alt.

jobo 19. Feb 2023 21:47

AW: SQLite Spalte Typ ändern
 
Ja, etwas tiefer findet man auch einen Kommentar aus 2021, dass die Antwort es sei nicht möglich, veraltet ist.
Noch tiefer der aktuelle Status quo, dass der Befehl nun da ist und Verweise auf die Doku.
Dort findet man auch diverse Angaben, wo das Löschen einer Spalte scheitert, trotz der Einführung des Befehls. Diese dürften allerdings weniger als Fehler, sondern als Feature zu werten sein, Stichwort Daten-Konsistenz.

Peter-Pascal 19. Feb 2023 21:52

AW: SQLite Spalte Typ ändern
 
ja, so sehe ich das auch

anse 20. Feb 2023 06:38

AW: SQLite Spalte Typ ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
ALTER TABLE DROP COLUMN wird ab der sqlite3.dll Version 3.35.1 unterstützt, also erst seit März 2021: https://www.sqlite.org/changes.html#version_3_35_0

Die sqlite3.dll aus meinem Delphi 11.2 Verzeichnis C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\ hat eine ältere Versionsnummer: 3.31.1 (Januar 2020)

Du könntest die dll gegen eine neuere von https://www.sqlite.org/download.html tauschen um die neuesten SQL-Features zu bekommen, inkl. eines Fixes für deinen Fehler. Ich weiß nur nicht ob Delphi hier für 32/64 Bit unterschiedliche DLLs vorhält. Ich hab hier nur die 32 Bit Version gefunden.

Peter-Pascal 20. Feb 2023 07:43

AW: SQLite Spalte Typ ändern
 
Hallo Anse,
danke für Deine Mühe.
So erklärt es sich, dass in der Anleitung der Befehl aufgeführt wird, aber nicht funktioniert.
Gruß Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz