Seite 1 von 2

[gelöst} SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 15:29
von Pit Zyclade
Gibt es das unter base überhaupt?
Ich habe mal vor Jahren notiert:
alter table "Übersicht" alter column "ID" RESTART WITH 1500

Aber bei meiner Überprüfung hat das niemals geklappt.
(Abgesehen von den Eigenschaften von ID (max Stellen ? ) und eventueller Automatik)

Danke für Diskussion.

Re: SQL Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 15:46
von Wanderer
Hallo Pit,

erste Frage ist eventuell Firebird oder HSQLDB.
Der andere Punkt wäre, ob es schon Datensätze mit höheren Werten gibt und woran Du erkennst, dass es nicht funktioniert.

Schau mal in die folgende Lösung von Robert:

https://ask.libreoffice.org/t/in-meiner ... m/65301/15

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 16:10
von Pit Zyclade
HSQLDB ist die Probedatei.

Vielleicht verstehe ich das Ziel nicht richtig?

Wenn ich eine Datei mit 5 Datensätzen habe, die alle in der Spalte ID Einträge anzeigen, den mit dem größten Wert habe ich auf 100 per Hand überschrieben, in den Einstellungen sind Länge 100 und Autowert eingetragen, gesichert, geschlossen und erneut geöffnet und nun per SQL
alter table "Übersicht" alter column "ID" RESTART WITH 1355
eingebe, dann wird mir zwar der Erfolg bestätigt, aber gleichzeitig kein Wert verändert und wenn ich nachprüfe, sind sie auch unverändert.

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 17:11
von RobertG
Hallo Pit,

der Befehl

Code: Alles auswählen

alter table "Übersicht" alter column "ID" RESTART WITH 1355
setzt für den nächsten einzufügenden Datensatz die Nummer 1355 fest und zählt ab da weiter. Der Befehl gilt nur für die HSQLDB. Bei Firebird müsste "column" weggelassen werden und der Wert auf 1254 gesetzt werden, damit der nächste genutzte Wert 1355 ist.
Du beeinflusst damit nur den internen Zähler, der Dir die automatischen Werte liefert - nicht die bereits bestehenden Werte. Der nächste Datensatz hat dann die ID = 1355.
Wenn Du stattdessen bereits bestehende Werte ändern willst, dann geht so etwas mit einem UPDATE-Befehl:

Code: Alles auswählen

UPDATE "Übersicht" SET "ID" = "ID"+1355
Aber Vorsicht: jetzt wird bei allen Datensätzen die ID um den Wert 1355 erhöht! Ist es das, was Du erwartet hast?

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 18:16
von Pit Zyclade
RobertG hat geschrieben:
Mi 18. Okt 2023, 17:11
Hallo Pit,

.... Ist es das, was Du erwartet hast?
Hallo Robert (G)
Nein, ich Dummer dachte und suchte (obwohl es keinen dringenden Bedarf bei mir gibt) eine einfache Möglichkeit, wie man den Index neu aufbauen kann, aber mit einem Startwert größer 0 (denn das war mit ja bekannt).

Ich vermute jetzt, dass das nur in drei Schritten geht, erstens ID löschem, ID mit Standard neu generieren (kann ich schon) und dann als dritten Schritt den zweiten von dir genannten, der also alle um einen Betrag erhöht.
Richtig?

Danke für Anleitung!

ABER noch eine Frage: Wieso muss man bei Firebird (ich habe noch keine Anwendung selber) eine kleinere Zahl nehmen, um dennoch eine größere als Folge-ID zu erreichen? Was bedingt das?

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 19:51
von RobertG
Hallo Pit,

bei Firebird gibt es nicht standardmäßig einen Autowert. Da ist diese Funktion über den Treiber von LibreOffice integriert. In Firebird selbst wird dazu ein Generator benutzt. Und dieser Generator bekommt jetzt die Botschaft: Nimm Zahl 1355. Damit ist die Zahl für ihn weg und die nächste Zahl, die er generiert, ist 1356.

Wir könnten jetzt natürlich hin gehen und das Ganze über den entsprechenden Code in LibreOffice an HSQLDB anpassen, aber wer diesen Code nutzt kann ja auch einmal ins Handbuch schauen. Da gibt es in Base deutlich wichtigere Baustellen.

Ich nutze das Ganze übrigens meist dann, wenn eine Datenbank alle Tests hinter sich hat und vor dem ersten Start von sämtlichen Testdaten befreit wird. Dann setze ich einmal den Startwert auf '1' fest, so dass es anschließend mit der ID=1 los geht und der Nutzer/die Nutzerin ist zufrieden.

Gruß

Robert

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Mi 18. Okt 2023, 23:20
von Wanderer
Pit Zyclade hat geschrieben:
Mi 18. Okt 2023, 18:16
... suchte (obwohl es keinen dringenden Bedarf bei mir gibt) eine einfache Möglichkeit, wie man den Index neu aufbauen kann, aber mit einem Startwert größer 0 (denn das war mit ja bekannt).

Ich vermute jetzt, dass das nur in drei Schritten geht, erstens ID löschem, ID mit Standard neu generieren (kann ich schon) und dann als dritten Schritt den zweiten von dir genannten, der also alle um einen Betrag erhöht.
Richtig?
...
Wenn Du die ID löscht, kannst Du die Tabelle nicht mehr schreiben/ändern - ist also keine gute Idee, wenn die Tabelle nicht leer ist.

Den UPDATE-Befehl kannst Du direkt absetzen, allerdings werden die ID Werte nur +1355 erhöht. Wenn Du vorher 1, 2, 3, 4 hattest also 1356, 1357, 1358, 1359. Gab es aber Lücken, bleiben diese erhalten: 1, 3, 10, 19 > 1356, 1358, 1365, 1374. Um Lücken zu schliessen musst Du erst eine Zeilennummer bzw. Rang erzeugen und +1355 in die Datei schreiben. Leider wird ROWNUM() wohl erst ab HSQLDB V2.2 unterstützt und nicht von der in LO enthaltenen 1.8. (Nicht geprüft.)

Quick'n'dirty by kleiner DB: Komplett-Export nach Calc, dort ID herunterziehen, dann DB-Tabelke löschen und von Calc neu einspielen...

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Do 19. Okt 2023, 08:18
von Pit Zyclade
Wanderer hat geschrieben:
Mi 18. Okt 2023, 23:20
Pit Zyclade hat geschrieben:
Mi 18. Okt 2023, 18:16
Ich vermute jetzt, dass das nur in drei Schritten geht, erstens ID löschem, ID mit Standard neu generieren (kann ich schon) und dann als dritten Schritt den zweiten von dir genannten, der also alle um einen Betrag erhöht.
Richtig?
...
Wenn Du die ID löscht, kannst Du die Tabelle nicht mehr schreiben/ändern - ist also keine gute Idee, wenn die Tabelle nicht leer ist.
Doch das geht so, wie ich beschrieb! Ich hatte es experimentell überprüft:
1.
alter table "Übersicht" drop column "ID"
Danach DB sichern, schließen und neu öffnen.
2.
alter table "Übersicht" add column "ID" integer generated by default as identity before "Name"
3.
update "Übersicht" SET "ID" = "ID"+100
und dann beginnt ID nicht mit 0, sondern 100.

Re: SQL Index Neugenerierung mit Startwert ?

Verfasst: Do 19. Okt 2023, 08:46
von RobertG
Hallo Pit,

habe ich das jetzt richtig verstanden? Du hast eine Tabelle mit Inhalt und Primärschlüssel "ID". Du nimmst diesen Schlüssel weg. Dann erhältst Du eine schreibgeschützte Tabelle (zumindest bei der internen HSQLDB). Du fügst jetzt ein Schlüsselfeld als AutoWert-Feld wieder hinzu??
Schon da müsste einiges nicht mehr funktionieren, denn es gibt ja lauter Zeilen, in denen kein Schlüsselwert existiert. Und das ist nicht möglich.

Eine bereits leere Tabelle kannst Du auch direkt mit ALTER TABLE auf den neuen Startwert setzen.

Gruß

Robert

Re: [gelöst} SQL Index Neugenerierung mit Startwert ?

Verfasst: Do 19. Okt 2023, 09:02
von Pit Zyclade
Hallo Robert
Du machst mich stutzig. Vielleicht machst du ein kleines Beispiel, wo ich deine Zweifel nachvollziehen kann.

Ich sende hier meine (abstrakte) Beispieldatei, die ich benutzt habe, mit den IDs 1,3,5,100,105
base - Testdatenbank mit Zeitfeld .zip
nicht enzippen, umbennen in *.odb
(10.44 KiB) 290-mal heruntergeladen
Gruß

Pit