[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2007
    Beiträge
    4

    ALTER TABLE ... NOT NULL

    Hallo,

    Bei folgendem SQL-Statement erhalte ich eine Fehlermeldung (verwendete OS V5R2M0):

    alter table testtable add col1 varchar(50) NOT NULL

    Die Fehlermeldung lautet:
    Error: [IBM][iSeries Access ODBC-Treiber][DB2 UDB]SQL0109 - Klausel NOT NULL unzulässig.

    In der Tat steht in den SQL-References folgender Text:
    Specifies null as the default for the column. If NOT NULL was specified,
    DEFAULT NULL must not be specified within the same column-definition.

    Verwirrend ist jedoch, dass ich eine create table oder ein alter column ohne DEFAULT-Eigenschaft ausführen kann.

    Führe ich den alter table .. add column falsch aus oder hat mir irgendwer noch ein Tip dazu?

    Vielen Dank

    Daniel

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo Daniel,

    beim Anlegen einer Tabelle ist ein Default-Wert nicht erforderlich, da zu diesem Zeitpunkt in der Tabelle noch keine Sätze vorhanden sind.

    Beim Hinzufügen einer Spalte zu einer bestehenden Tabelle wird davon ausgegangen, dass in der Tabelle bereits Sätze angelegt wurden. Da bei "NOT NULL" NULL als Unterlassungswert nicht zulässig ist, muss ein Defaultwert angegeben werden, damit die bereits bestehenden Sätze in der neuen Spalte mit einem Wert initialisiert werden können.

    Aus diesem Grund muss beim Alter Table immer NOT NULL WITH DEFAULT angegeben werden.

    Wenn Du übrigens über die Hilfe die Detail-Nachrichten von SQL0109 angeschaut hättest oder über die Messagefile den Detail-Text von Message-Id SQL0109 angezeigt hättest, hättest Du den folgenden Kommentar sehen müssen:
    -- Die Klausel NOT NULL ist in der Definition einer Spalte, die zu einer Tabelle hinzugefügt wird, nicht zulässig, es sei denn, es ist ein Standardwert angegeben.
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Jun 2001
    Beiträge
    727
    Schau dir mal mit dem i5/OS Command :

    Code:
    DSPMSGD RANGE(SQL0109) MSGF(QSQLMSG)
    die komplette Fehlermeldung an. Hier findest du deine Antwort :
    Code:
    ...
      -- Die Klausel NOT NULL ist in der Definition einer Spalte, die zu einer  
     Tabelle hinzugefügt wird, nicht zulässig, es sei denn, es ist ein           
     Standardwert angegeben.
    ...
    Man darf nicht mal 10 Minuten was anderes machen.
    Da war die Birgitta wieder schneller. ;-)

  4. #4
    Registriert seit
    Dec 2007
    Beiträge
    4

    ALTER TABLE ... NOT NULL

    Hallo Birgitta,

    Vielen Dank für die Antwort.

    Dass ein alter table add column mit NOT NULL nicht einfach auf eine "gefüllte" Tabelle losgelassen werden kann ist einleuchtend. In diesem Fall wird jedoch der Alter Table auf ein "leere" Tabelle ausgeführt.

    Da das Verhalten bei Inserts mit NOT NULL WITH DEFAULT anderst ist als ohne Standartwerte kann ich die Option leider nicht anwenden (etwas komplexerer Hintergrund).

    Wie gesagt kann ich folgende Beispielstatements anwenden:
    1. alter table testtable add col1 varchar(50)
    2. alter table testtable alter col1 set not null

    Und das fehlerfrei ...

    Elegant wäre es natürlich, wenn das alles in einem Statement (z. Bsp. "alter table testtable add col1 varchar(50) not null") definiert werden kann. Kann ich somit davon ausgehen, dass die AS/400 diese Option "noch" nicht unterstützt.

    Viele Grüsse

    Daniel

  5. #5
    Registriert seit
    Jul 2001
    Beiträge
    2.646
    Zitat Zitat von Sven Schneider Beitrag anzeigen

    Man darf nicht mal 10 Minuten was anderes machen.
    Da war die Birgitta wieder schneller. ;-)
    Klein und flink ;-)

    SCNR,
    -h

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    @Sven

    ... das sieht ja fast aus, aus würden wir nur darauf lauern, dass irgendjemand eine Frage stellt und wir uns darum prügeln müssen wer zuerst antworten darf

    @Holger
    ... besser klein und zackig als groß und dappig

    @Daniel
    ... die Variante, die Du gerne hättest wird wahrscheinlich nie unterstützt werden. Einfach weil es weder SQL Standard, noch sauber und zu fehleranfällig ist. So wie es jetzt implementiert ist, ist es leicht zu erklären und einsichtig. Zu erklären warum das gleiche Statement einmal funktioniert (leere Tabelle) und einmal nicht (gefüllte Tabelle) ist viel schwieriger. Außerdem würde dann gleich der nächste angekleckert kommen und verlangen, dass das auch für gefüllte Tabellen gehen muss (was nicht möglich ist).

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

Similar Threads

  1. Tabelle mit ALTER TABLE ändern - ohne Datentransfer
    By Matthias182 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 03-12-07, 12:05
  2. Darstellung der Null im LPEX-Editor (WDSC)
    By Ewald in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 25-01-07, 07:52
  3. NOT NULL WITH DEFAULT
    By deni87991 in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 04-08-06, 10:32
  4. Zugriff auf Serielle Schnittstelle aus RPG/VARPG
    By Kampi4 in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 25-11-05, 07:37
  5. Embedded SQL - Datenbankoptionen in VARPG
    By woki in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 13-04-04, 12:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •