Artikelnummer in der Datenbank um führende Nullen ergänzen. Befehl korrekt?

Hallo,
ich habe in einer Datenbanktabelle Artikel stehen, die unterschiedlich lange Artikelnummern haben. Es gibt auch welche die bereits 6-stellige Nummern besitzen. Diese haben niemals eine führende Null.

Ziel ist es, alle Artikelnummen 6-stellig zu machen indem sie mit führenden Nullen aufgefüttert werden.
Meine Idee lautet:
UPDATE table Artikel Artikelnummer=LPAD(Artikelnummer, 6, ‚0‘) where LENGTH(Artikelnummer)<6

Kann das Funktionieren? Ist das Sicher?

MfG Frank

Das Where kannst du dir sparen, zumindest im mysql. Das LPAD fügt die Null nur an, bis die Zeichenkette 6 oder mehr Zeichen hat.

Ich würde halt überlegen, ob du das wirklich in die Datenbank reinschreiben willst oder ob dir das beim Lesen nicht reicht.

Hi!

Naja, es ist doch ein UPDATE und falls die Artikelnummer mehr als 6 Stellen hätte, würde diese auf 6 Stellen gekürzt werden (zumindest unter Oracle).
Wenn es keine längeren Artikelnummern gibt, nutzt es natürlich nix, schadet aber auch nicht - lieber eine WHERE-Klausel bei einem Update zuviel, als eine zuwenig.

Grüße,
Tomh

Das hast du uns bisher verschwiegen.

Wer vage fragt, kriegt vage Antworten. In MySQL ist das explizit nicht so, dass dort Daten abgeschnitten werden. Und dass das bei Oracle so sein soll, kann ich kaum glauben. Nenn mal deine Quelle.

Nochmal: Lass die Finger von den Daten in der Datenbank. Es hat ja sicher einen grund, dass die Daten so drin stehen, wie sie nunmal drin stehen. Und nach deiner vagen Beschreibung ist das ein System, was schon ein bisschen im Einsatz ist und in dem wichtige Daten drin stehen. Sonst hättest du nicht gefragt, ob es sicher ist .

Dieses LPAD() kannst du auch im SELECT machen. Dort gehört es meiner Meinung nach hin, weil es mit Sicherheit keine Auswirkungen auf bereits bestehende Abfragen hat.

Egal wie: Ich würde mir einen Klon der Datenbank ziehen und mein Kommando darauf testen, dann siehst du, ob es sicher ist.

1 Like

Hi!

Ich habe gar nix verschwiegen, ich habe lediglich eine weitere Antwort gegeben.

Meinst Du mich oder den Threadersteller … falls Du mich meinst, hab ich wenig Lust, meinen Job aufzugeben :wink:

Quelle? Ich habe es selber gerade auf Oracle ausprobiert (weil ich da grad verschieden Oracle-Versionen so herumliegen habe)

select lpad(\'1234567890\',6,\'0\') from dual

ergibt hier ein beinhartes

123456

(OK, ich habe es mittels TOAD gemacht, ich wollte nicht extra ein SQL*Plus aufmachen)

Wenn ein Update eines Textfeldes (auch wenn es „ARTIKELNUMMER“ heißt) Auswirkungen auf bestehende Abfragen (ich würde eher sogar generell „auf die bestehende Applikation“ schreiben) hat, dann ist wohl das gesamte Datenmodell in Frage zu stellen; vor allem, warum keine künstlichen IDs verwendet wurden (und genau diese Situation hier ist auch einer der handfesten Gründe für künstliche IDs)
Das Update auf die Tabelle ist schon der richtige Weg, anstatt das LPAD bei jedem Vorkommen in der Applikation zu verwenden.

Grüße,
der nicht Ursprungsposter Tomh

Ein PS wäre angebracht: Die künstlichen IDs meinte ich natürlich für den Primary Key.

Huch, stimmt wohl. Sorry.

Nee, das war so nicht gemeint. Soll nicht heißen, er solle die Finger von Datenbanken an sich lassen soll.
Ich meinte, er soll nicht am kompletten Datensatz einer lagacy-Datenbank rumzufummeln, weil er eben nicht weiß, ob nicht irgendeine krude Abfrage die jetzige Form der Daten erwartet.

unglaublich. Pad sollte nur padden und nicht trimmen. Aber was weiß ich schon?

Das Datenmodell kennen wir halt nicht. Aber wenn er das so fragt wie er es fragt, schwant mir Schlimmes.

Wenn das auf ALLE Abfragen auf diese Spalte innerhalb der anwendbar ist und das auch im Einzelfall geprüft wird, dann stimme ich dir uneingeschränkt zu. Das klang halt für mich anders, so als ob er irgendwas neues baut und dabei das alte nicht kaputt machen will. Aber auch das wissen wir natürlich nicht.

Für mich ist halt die Frage, warum die Dinger ohne führende Nullen dort eingetragen werden, wenn die doch wichtig sind. So ein Update sollte ja nun nicht mehr als einmal gemacht werden müssen, weil man das ja eigentlich nur dann macht, wenn man irgendwo einen bug gefixt hat und danach die Datenbankinhalt an die neue Programmierung anpassen will. Oder will unser Frager eventuell weiterhin falsche Artikelnummern eintragen lassen und dafür seinen snippet regelmäßig triggern? So viele Fragen…

Und weil wir das alles nicht wissen, habe ich ihm den sichersten Weg vorgeschlagen: Lass die Daten in der Datenbank wie sie sind und mache das in der Abfrage. Damit macht er keinen legacy-code kaputt und kann auch sonst keine Scheiße an den Daten bauen. Das nur zum Verständnis meines Ansatzes.

Hi!

Ach, da gibt’s viele Gründe, die ich selber schon erlebt habe: Altsystemübernahmen, Datenimporte, nach einiger Zeit kam man drauf, dass man doch mehr Artikel hat und die Stellen nicht mehr ausreichten und so die „alten“ Daten adaptieren musste … oder ganz einfach weil man plötzlich draufkam, das natürliche Idientifizierer mit einheitlicher Länge doch besser „aussehen“ bzw. das Ganze dann wesentlich übersichtlicher aussieht.
Und da gibt es sicherlich noch wesentlich mehr Situationen für solche „Wünsche“.

Grüße,
Tomh

1 Like

Beim Anlegen neuer Artikel wird automatisch eine Artikelnummer vergeben. Das Format dieser Artikelnummern kann man im Vorfeld festlegen.
Das habe ich versäumt aber mittlerweile nachgeholt.

Da die Sortierung der Artikel alphabetisch erfolgt, stehen Artikel 1, 10 und 100 ganz weit oben. Das ist technisch kein Problem, aber nervig.
Die vorhandenen sechstelligen Artikelnummern sind durch eine Datenübernahme aus einem anderen System entstanden.

Derzeit sind ca. 250 Artikel angelegt worden. Für die zukünftigen Artikel ist das Problem gelöst. Ich würde nur gerne den vorhandenen Bestand nachträglich an das Nummern-System anpassen.

In der Tabelle „Artikel“ lautet die erste Spalte ebenfalls „Artikel“. Dort steht offensichtlich der Primary Key (die ID) des Artikels. Die Spalte „Artikelnummer“ ist tatsächlich eher als Suchtext zu verstehen.
Was der Barcodescanner übergibt, wird in dieser Spalte gesucht.

MfG Frank Müller

Wenn es nur Nummern sind, warum schreibst du dann keinen Integer, sondern einen String? Damit hättest du das Problem vom Hals.

Das wäre damit gleich mit erledigt, denn 0001=1, wenn es Integers sind.

Wie gesagt, Anzeige und Speicherung sind dabei 2 Paar Schuhe.