AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben
Thema durchsuchen
Ansicht
Themen-Optionen

Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

Offene Frage von "mkinzler"
Ein Thema von Der schöne Günther · begonnen am 16. Feb 2016 · letzter Beitrag vom 16. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 11:33
Datenbank: ALS • Version: 11.0 • Zugriff über: FireDAC
Ich habe das gemacht, was man laut diesem schlauen Thread:
http://www.delphipraxis.net/187239-a...er-zahlen.html
niemals tun sollte: Bezeichner die heute nach Zahlen aussehen als Integer speichern. Ich habe extra zwei mal gefragt, aber jetzt sollen bitte doch Buchstaben drin vorkommen können.

An sich ist das einfach. Sage ich einfach
Code:
ALTER TABLE "meineTabelle"
ALTER COLUMN "meineSpalte" "meineSpalte" CHAR(40)
wird aus meiner Spalte vom Typ "ShortInteger" eine "CHAR(40)"-Spalte. Aber Moment, was passiert mit den Daten die da schon drin stehen? Eine 5 wird zu einer "5" , eine 0 zu einer "0" . Eigentlich kann hier nichts falsch laufen.

Aber wer garantiert mir das? Selbst den Rückweg macht meine "SAP Advantage Database"-Datenbank ohne Probleme: Aus einer "5" wird eine 5 , aus einer "5a" wird eine 5 und aus "Delphi" wird eine 0 ! Das ist schon etwas gruselig. Meine Frage: Gibt es einen Standard von dem man halbwegs ausgehen kann? Macht da jedes DBMS anders? Ich finde in meiner Doku zu Typkonversionen nichts.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#2

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 11:36
Man kann da bestimmt auch eine Konvertierungsfunktion mit angeben, welche man für eine explizite Konvertierung nutzen kann.
In deiner Richtung sollte die Standardkonvertierung aber ausreichen.

Wenn meineSpalte INTEGER ist und meineSpalte::VARCHAR bzw. CAST(meineSpalte AS VARCHAR) funktioniert, oder wie auch immer ein CAST geht, dann kann man die manuelle Konvertierung weglassen.

Ansonsten ginge auch vorher ein UPDATE, wo alles "Ungültige" entfernt wird.



Aber eigentlich würde ich auch erwarten, daß bei unmöglicher Konvertierung (veränderte Inhalte, bzw. Datenverlust) ein Fehler geworfen wird.
Also z.B. auch bei VARCHAR(5) -> VARCHAR(10) = OK, aber VARCHAR(10) -> VARCHAR(5) = Fehler, wenn ein Text länger als 5 ist.


SQL-Code:
-- in PostgrSQL
ALTER TABLE [ ONLY ] name [ * ] ALTER [ COLUMN ] column [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
SQL-Code:
ALTER TABLE meineTabelle
ALTER COLUMN meineSpalte
TYPE CHAR(40)
USING cast(meineSpalte AS CHAR(40)) -- upper(trim(substr(meineSpalte, 3, 5)))
entspricht
SQL-Code:
UPDATE meineTabelle
SET meineSpalte = cast(meineSpalte AS CHAR(40));

ALTER TABLE meineTabelle
ALTER COLUMN meineSpalte
TYPE CHAR(40);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Feb 2016 um 11:54 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 11:37
was ist daran gruselig? Aber wenn Du niemandem traust (keine schlechte Eigenschaft beim programmieren), dann mach es doch selbst:

1. neue Spalte anlegen im Wunschtyp als tmpIrgendwas
2. alte Spalte in neue Spalte konvertieren (z.B. führende 0 anfügen,...)
3. alte Spalte löschen
4. neue Spalte anlegen
5. Daten aus der temporären Spalte in die endgültige Spalte verschieben
6. temp-Stalte löschen
7. ggf. witere Aktionen (Index,...)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 11:51
Ich würde es etwas einfacher machen
1) neue Spalte anlegen
2) alte Spalte in neue Spalte konvertieren (Führende Nullen/Tausendertrennzeichen etc.)
3) Indizes anpassen falls notwendig/Trigger/Constraints oder 1a)
...
Irgendwann einmal alte Spalte löschen.
Den alten Namen für die neue Spalte weiter benutzen würde ich nicht, da es dann mal unbeabsichtigt knallen könnte wenn Du eine Typänderung vergessen hast.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#5

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 11:55
Den alten Namen für die neue Spalte weiter benutzen würde ich nicht, da es dann mal unbeabsichtigt knallen könnte wenn Du eine Typänderung vergessen hast.
Aber so bekommt man nicht mit, wenn man irgendwo im Code noch auf die alte Spalte geht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 12:04
Aber so bekommt man nicht mit, wenn man irgendwo im Code noch auf die alte Spalte geht.
Auch'n Argument, also nicht irgendwann, sondern sofort die alte Spalte löschen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 12:05
Den alten Namen für die neue Spalte weiter benutzen würde ich nicht, da es dann mal unbeabsichtigt knallen könnte wenn Du eine Typänderung vergessen hast.
Das verstehe ich nicht. Meinst du wenn ich, mittels Delphis wunderbarem Variant -Typ an X Stellen auf dieses Feld zugreife und jetzt vergesse, alle zu erwischen? Das würde mir doch zur Laufzeit genauso um die Ohren fliegen wie wenn ich mit FieldByName(..) auf ein nicht mehr vorhandenes Feld zugreife.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 12:30
Na irgendwann mußt Du ja Farbe bekennen und dich für Integer oder String entscheiden und spätestens dann macht es Plopp.
Da ich Variant wann immer es geht vermeide, habe ich das Vergnügen halt früher.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 14:07
Ich schließe mich himitsu an.
Update auf Zielinhalt, dann den Typ der Spalte ändern.
Es kann aber sein, dass es tatsächlich Systeme gibt, die das nicht mögen. Dann bleibt nichts als der Umweg über eine zusätzliche Spalte.

Wenn man keine Altlasten haben möchte, lieber alles sofort durchgehend umstellen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#10

AW: Den Typ einer Spalte nachträglich ändern. Daten sollen bestehen bleiben

  Alt 16. Feb 2016, 14:48
Wenn beim Umstellen "Datenverlust" entsteht, also z.B. aus "a1" eine 1 wird, dann eventuell eine Kopie der Daten behalten.
* Spalte umbenennen (hier bleiben aber eventuelle Referenzen bestehen)
* neue Backup-Spalte und alte Spalte löschen/ändern
* oder einfach als DB-Backup

Aber die Spalte unter dem bekannten Namen besser weg, damit man Fehler findet.
Muß etwas weiter auf die alte Spalte gehen, dann explizit auf das Backup umstellen und vielleicht noch einen Synchro-Trigger, der die Spalten abgleicht.

Ob man nun die neue Spalte neu erstellt und die Alte löscht, oder die Alte nur Konvertiert, ist dann geschmackssache, bzw. hängt vom DBMS ab.

IMHO
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Feb 2016 um 14:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:39 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