Stai inserendo stringhe vuote e le stringhe vuote non sono NULL , per verificare la presenza di NULL errore fare:
INSERT INTO `addresses` (`street`, `city`, `state`, `zip`) VALUES (NULL, NULL, NULL, NULL);
e vedrai l'errore. Il NOT NULL controlla solo i valori che non sono NULL .
Per evitare stringhe vuote devi usare trigger
oppure esegui i controlli sul linguaggio di programmazione lato server per convertire le stringhe vuote in NULL prima di eseguire INSERT query. Un esempio di trigger per INSERT potrebbe essere come:(questo è solo un esempio)
CREATE TRIGGER avoid_empty
BEFORE INSERT ON addresses
FOR EACH ROW
BEGIN
IF street = '' THEN SET street = NULL END IF;
END;