Can: MySQL-Wieso werden null-werte eingefügt

Hallo Leute,
ich habe ein Problem. Ich erstelle zwei Tabellen in MySQL...

Eine für user und eine für status:

  
create table u(  
  
	id int auto_increment,  
        wid int,  
        nick varchar(20) not null,  
        pw varchar(20) not null,  
        primary key(id),  
        foreign key(wid) references what(id)  
  
);  
  
create table what(  
  
	id int auto_increment,  
        bezeichnung varchar(25) not null,  
        primary key(id)  
);  
  
insert into what(bezeichnung) values ('admin'),('user'),('guest');  
  
insert into u( wid, pw) values (1, 'hmm'); --wieso geht das? nick ist doch auf not null. Sollte keine Fehlermeldung kommen  

Siehe Kommentar im COde für die Frage...
Danke im voraus

  1. Tach!

    insert into u( wid, pw) values (1, 'hmm'); --wieso geht das? nick ist doch auf not null. Sollte keine Fehlermeldung kommen

    NOT NULL heißt nicht, dass das ein Zwangsfeld mit einer bestimmten Stringlänge ist. Wenn du es nicht mit angibst, wird der Default-Wert eingetragen, was in deinem Fall ein Leerstring ist.

    dedlfix.

    1. Tach!

      insert into u( wid, pw) values (1, 'hmm'); --wieso geht das? nick ist doch auf not null. Sollte keine Fehlermeldung kommen

      NOT NULL heißt nicht, dass das ein Zwangsfeld mit einer bestimmten Stringlänge ist. Wenn du es nicht mit angibst, wird der Default-Wert eingetragen, was in deinem Fall ein Leerstring ist.

      Was hat not null dann für einen sinn? Dann kann man es ja gleich weglaassen

      1. Tach,

        NOT NULL heißt nicht, dass das ein Zwangsfeld mit einer bestimmten Stringlänge ist. Wenn du es nicht mit angibst, wird der Default-Wert eingetragen, was in deinem Fall ein Leerstring ist.

        Was hat not null dann für einen sinn? Dann kann man es ja gleich weglaassen

        es verhindert dass null eingetragen wird; in deinem Falle wäre es sinnvoll einen anderen Default-Wert für die Spalte zu bestimmen, wie wäre es mit null?

        mfg
        Woodfighter

        1. Tach!

          Was hat not null dann für einen sinn? Dann kann man es ja gleich weglaassen
          es verhindert dass null eingetragen wird; in deinem Falle wäre es sinnvoll einen anderen Default-Wert für die Spalte zu bestimmen, wie wäre es mit null?

          MySQL lässt kein NULL als Defaultwert für ein NOT-NULL-Feld gelten. Keinen Default-Wert anzugeben resultiert in einem Leerstring als Default-Wert (für ein NOT-NULL-Feld, sonst NULL). Ich fand auch keinen SQL-Mode, der MySQL zu einer Fehlermeldung veranlasst, wenn ein Feld nicht angegeben wird. Constraints auf andere Inhalte als Foreign Keys hab ich auch nicht gefunden.

          Vermutlich gibt es keine Lösung für das Problem des OP, was vermutlich das Verhindern von leeren Eintragen ist. NOT NULL würde das aber sowieso nicht vollständig erfüllen können, weil bereits ein Leerstring kein NULL mehr ist. Und rein optisch sind aus White-Space bestehende Strings auch valide Werte und sicher ebenso ungewünscht, selbst wenn noch eine Längenprüfung stattfindet. Für das vermutete Problem ist MySQL als alleinige Prüfinstanz nicht ausgelegt. (Einfügen über Stored Procedures mit Werteprüfung? Die kann man mit einem einfachen INSERT ignorieren.)

          dedlfix.

          1. Tach,

            MySQL lässt kein NULL als Defaultwert für ein NOT-NULL-Feld gelten. Keinen Default-Wert anzugeben resultiert in einem Leerstring als Default-Wert (für ein NOT-NULL-Feld, sonst NULL). Ich fand auch keinen SQL-Mode, der MySQL zu einer Fehlermeldung veranlasst, wenn ein Feld nicht angegeben wird. Constraints auf andere Inhalte als Foreign Keys hab ich auch nicht gefunden.

            bäh, du hast natürlich recht, auch wenn ich mir ziemlich sicher war, das schon benutzt zu haben, aber das war dann wohl nicht mit Mysql; mit TEXT statt VARCHAR würde es funktionieren, da TEXT keinen Default haben kann, aber dafür hat das andere Nachteile.

            mfg
            Woodfighter

            1. Tach!

              mit TEXT statt VARCHAR würde es funktionieren, da TEXT keinen Default haben kann,

              Der zweite Teil stimmt, aber ans Ziel bringt den OP ein TEXT-Feld auch nicht, denn MySQL gibt auch dann keinen Fehler aus. Ein NOT-NULL-TEXT-Feld wird ohne eine Angabe beim INSERT stillschweigend mit einem Leerstring befüllt.

              dedlfix.

              1. Tach,

                Der zweite Teil stimmt, aber ans Ziel bringt den OP ein TEXT-Feld auch nicht, denn MySQL gibt auch dann keinen Fehler aus. Ein NOT-NULL-TEXT-Feld wird ohne eine Angabe beim INSERT stillschweigend mit einem Leerstring befüllt.

                mmh ok, damit hätte ich nicht gerechnet.

                mfg
                Woodfighter