![]() |
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
Hi,
ich habe eine Tabelle, in der ich den vorhandenen Primärschlüssel löschen möchte und eine neue ID-Spalte zum Primärschlüssel machen möchte. Das mache ich so:
SQL-Code:
Dabei erscheint diese Fehlermeldung:
CREATE SEQUENCE GEN_KUNDEPREIS_ID; commit;
ALTER TABLE KUNDEPREIS DROP CONSTRAINT PK_KUNDEPREIS; commit; ALTER TABLE KUNDEPREIS ADD ID INTEGER; commit; Update KundePreis set ID = (select gen_id(GEN_KUNDEPREIS_ID, 1) from rdb$database); commit; ALTER TABLE KUNDEPREIS ALTER ID SET NOT NULL; commit; ALTER TABLE KUNDEPREIS ADD CONSTRAINT PK_KUNDEPREIS PRIMARY KEY (ID); commit; <--- Fehler hier!!!! Zitat:
|
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
Ich mache das immer in einer Anweisung.
Also in deinem Fall würde ich folgende Anweisung an den Server schicken:
Code:
ALTER TABLE KUNDEPREIS ADD ID INTEGER NOT NULL PRIMARY KEY;
|
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
Zitat:
|
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
DDL und DML laufen in unterschiedlichen Transaktionskontexten. Bei vielen Metadatenänderungen
benutzen wir daher innerhalb von IBExpert einen reconnect befehl dafür, den es aber nicht überall gibt. mach mal vor deinem zweiten alter table block nach dem update/commit so ein reconnect dann sollte das klappen wenn nicht andere auch auf der db sind |
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
Zitat:
|
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
habe ich auch noch nicht gehört, das der PK null sein sollte.
So gut wie ALLE Datenbank-Systeme/Server initializieren den PK mit einer fortlaufenden Nummer... Felder die Null sind, sind solchem die gerade angelegt wurden, und es kein Dateneinschub stattgefunden hat. Eventuell FieldByName->AsString := ''; damit das Feld für String-Eingabe initzialisiert wird, sofern das Datenfeld auch mit CHAR/VARCHAR/TEXT erstellt wurde. Die Anzahl der COMMIT Anweisungen macht mir irgendwie sorgen - sollte da nicht ein Transaktionsblock besser gedient haben ? Manche SQL-Systeme/Server verstehen START TRANSACTION/BEGIN ... END/END TRANSACTION COMMIT. Bin mir da jetzt nicht sicher, ob die Server Festplatte dadurch nicht besser geschütz wäre - für Datenbankzugriffe - in einer modernen Welt mit DSL-Geschwindigkeiten.... |
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
Zitat:
|
AW: Neuer Primärschlüssel kann nicht angelegt werden: validation error / Null-Problem
besser nicht vermischen, was da wo passiert oder passieren sollte
Ein PK braucht bei fast allen datenbanken not null columns, auch bei Firebird aber Ein PK muss aber keineswegs überhaupt existieren noch aus nur einer numerischen ganzzahligen spalte bestehen, die das Datenbanksystem mit irgendwas füllen sollte Daher sind irgendwelche Datenbanksysteme (welche auch immer das sind), die einen PK selber mit irgendwas selbstständig initialisieren, ohne das der SQL dazu die regel vorgibt, aus meiner sicht nur begrenzt relevant, wenn überhaupt existent. Aber zum thema: DDL/DML Transaktionen: Firebird kann ohne probleme im laufenden Betrieb während leute offenen Selects auf einer Tabelle mehrfach abfragen und dadurch eine bestimmte Struktur z.B. mit select * erwarten bedienen. Ein Alter Table add column .... erzeugt ein neues Format (in rdb$formats zu finden), in der dann auch die neue spalte zu finden ist. erst bei neu geschriebenen Datensätze wird da aber bei insert oder update dieses format herangezogen und man kann was in diese spalte schreiben. In jeder Datensatzversion innerhalb der Datenpages ist auch die verwendete rdb$format version hinterlegt 8bit, daher gibt es da unten in ibexpert manchma den hinweis xxx versions left on table yyy). Pro tabelle kann es 255 formats geben, für weitere alter table muss man dann ggf backup/restore machen. ich denke mal der Teil der Erklärung geht weit über das hinaus, was man sich so üblicherweise beim alter table add .... vorstellt, aber alte säcke wie ich kennen das auch noch von paradox oder dbase, bei denen eine strukturänderung dadurch gemacht wurd, das die komplette Tabelle in eine komplett neue Tabelle kopiert werden musste und das dauert ewig bei großen datenmengen, geschweige denn das man das mit offenen userconnections genau auf dieser Tabelle machen konnte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz