SQL-Code:
CREATE TABLE mytable (
field1
VARCHAR(255),
field2
VARCHAR(255)
DEFAULT '
',
field3
VARCHAR(255)
NOT NULL,
field4
VARCHAR(255)
NOT NULL DEFAULT '
'
);
-- fehlt field3/4, dann wird dort der DEFAULT genommen
-- field3 muß also immer übergeben werden, da es keinen DEFAULT hat und somit einen Wert benötigt
INSERT INTO mytable (field1, field3)
VALUES ...;
-- hier müssen alle Felder übergeben werden und bei field3/4 dürfen keine NULL drin stehen
INSERT INTO mytable
VALUES ...;
-- bei einigen DBMS kann man im INSERT und UPDATE auch "DEFAULT" angeben, selbst wenn das Feld angegeben wird
-- bei field4 ein NULL zu übergeben knallt natürlich
INSERT INTO mytable (field3, field4)
VALUES ('
aa',
DEFAULT);
-- hier in einem Dataset.Insert, werden field2/3 niemals übergeben (fehlen im automatisch generierten INSERT und UPDATE)
-- die field1 und field4 werden nach einem Dataset.Insert nur übergeben, wenn dort etwas eingetragen wurde (siehe fehlen dann also auch und bekommen ihren DEFAULT, wenn vorhanden)
-- bei field3 wird es also knallen, da es NOT NULL ist und keinen DEFAULT hat
-- field4 wird beim Dataset.Insert nicht knallen, da es im automatischen INSERT fehlt, wenn dort nichts zugewiesen wurde, und somit der DEFUALT benutzt wird
-- aber wird beim Dataset.Edit (UPDATE) das field4 auf NULL gesetzt (und vorher war es nicht NULL), dann knallt das natürlich auch
SELECT field1, field4
FROM mytable;
Wer ein Feld mit NUL NULL mit DEFAULT nicht kennt, dem ist das also im Normalfall egal.
ABER, wenn hier
SELECT *
verwendet wird und das Dataset auf die TField.Requiered (NOT NULL) reagiert (dieses Required von der
DB füllen lässt),
dann gibt es ein Problem, denn auf den DEFAULT reagieren viele
DB-Komponenten nicht (weil sie es nicht kennen und nicht wissen, dass es zwar Required ist, aber spätestens in der
DB doch einen Wert bekommen kann).
Ebenso ist es mit NOT NULL, wo der Wert im Trigger gefüllt wird. TDataSet weiß nichts davon und reagiert entsprechend auf das Requiered.
Bei uns wird aus Diesem und einem anderen Grund im Dataset.AfterInsert der DEFAULT-Wert aus der
DB abgerufen und eingefügt.
* einmal gibt es dann nach DataSet.Insert beim Post keine Fehlermeldung "Feld muß gefüllt sein"
* und der Benutzer sieht auch sofort, wo bereits Default-Daten vorhanden sind, die ja sonst eigentlich erstmal leer sind und erst beim Speichern (Post) von der Datenbank gefüllt werden.