C'è qualcosa di meglio di NOT NULL in Postgresql?

di il
4 risposte

C'è qualcosa di meglio di NOT NULL in Postgresql?

Ho creato un modulo per la registrazione di utenti in Spirng Boot. A causa di un mio errore ho cancellato un metodo e la webapp ha salvato durante una sedie di test i seguenti nickname:
""
" "
"Un chiodo"
Io pensavo che con NOT NULL non si potesse salvare il nulla ovvero "" ma non è così. Per gli altri casi in effetti è corretto in quanto non ho detto al DB che gli spazi non li voglio e che desidero avere almeno 1 carattere.
Mi stavo chiedendo se con CHECK potevo aggiungere queste condizioni oppure no.
La tabella è la seguente:
CREATE TABLE utenti (
    id BIGSERIAL NOT NULL,
    nome VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL,
    abilitato BOOLEAN NOT NULL,
    CONSTRAINT utenti_pk PRIMARY KEY(id),
    CONSTRAINT utenti_uk UNIQUE (nome)
);
Vorrei che nome e password non contengano lo spazio come carattere e soprattutto che non siano vuoti. Inoltre vorrei che password contenga almeno 8 caratteri sempre e comunque altrimenti la stringa non è una password. E' possibile fare questo con Postgresql oppure può solo essere fatto con java?

4 Risposte

  • Re: C'è qualcosa di meglio di NOT NULL in Postgresql?

    Partiamo dai fondamentali: NULL è diverso da Empty ("")
    Se vuoi controllare la lunghezza minima delle stringhe inserite (in aggiunta a NOT NULL) puoi usare CHECK constraint, es.
    "Vogliamo controllare che la stringa immessa nel campo nome sia di almeno 2 caratteri"
    add constraint check_min_length_nome check (length(nome) >= 2);
  • Re: C'è qualcosa di meglio di NOT NULL in Postgresql?

    Bravissimo!

    1) Grazie mille, posso impedire che all'interno di una stringa siano presenti spazi vuoti?
    2) E' consigliabile impostare anche UTF8 se nella WebApp uso questo encoding? Conviene farlo? Come si fa?
    3) C'è altro che dovrei fare per costruire una tabella in modo più professionale?
    4) L'ambiente di sviluppo è sicuramente diverso dal server su cui viene installato e configurato il DBMS (per esempio io uso Windows 10, il sistemista no, ecc...). Mi date qualche consiglio per rendere più compatibile il mio schema.sql con il DBMS che il sistemista installa sul server? Non vorrei che per qualche impostazione errata la mia WebApp non funzionasse.
    5) Come si dovrebbe editare il mio codice? C'è qualcosa che devo aggiungere in testa al mio DBMS?
    6) Può essere utile/conveniente decidere di creare le tabelle solo se inesistenti?
    7) Come dovrei editare la mia tabella?
    CREATE TABLE IF NOT EXISTS utenti (
        id BIGSERIAL NOT NULL,
        nome VARCHAR(100) NOT NULL,
        password VARCHAR(255) NOT NULL,
        abilitato BOOLEAN NOT NULL,
        CONSTRAINT utenti_pk PRIMARY KEY(id),
        CONSTRAINT utenti_uk UNIQUE (nome),
        CONSTRAINT lunghezza_minima_nome CHECK (LENGTH(nome) >= 1),
        CONSTRAINT lunghezza_minima_password CHECK (LENGTH(password) >= 10)
    );
    grazie in anticipo
  • Re: C'è qualcosa di meglio di NOT NULL in Postgresql?

    Ciao,
    ti direi di non effettuare ulteriori verifiche lato db aggiuntive alla CHECK constraint che ti ho specificato.
    La validazione / formattazione dei dati è meglio gestirla lato applicativo.
  • Re: C'è qualcosa di meglio di NOT NULL in Postgresql?

    Ok, grazie.
    Se scrivo una cosa così a tuo avviso è sbagliato?
    
    -- Si cancellano le tabelle del DBMS se esistenti ma solo in fase di sviluppo;
    DROP TABLE IF EXISTS utenti CASCADE;
    DROP TABLE IF EXISTS ruoli CASCADE;
    DROP TABLE IF EXISTS utenti_ruoli CASCADE;
    DROP TABLE IF EXISTS persistent_logins CASCADE;
    
    CREATE TABLE IF NOT EXISTS utenti (
        id BIGSERIAL NOT NULL,
        nome VARCHAR(100) NOT NULL,
        password VARCHAR(255) NOT NULL,
        abilitato BOOLEAN NOT NULL,
        CONSTRAINT utenti_pk PRIMARY KEY(id),
        CONSTRAINT utenti_uk UNIQUE (nome),
        CONSTRAINT lunghezza_minima_nome CHECK (LENGTH(nome) >= 1 AND nome !~ ' '),
        CONSTRAINT lunghezza_minima_password CHECK (LENGTH(password) >= 10)
    );
    Inoltre vorrei che la tabella ruoli iniziasse con "ROLE_", non mi dispiacerebbe aggiungere questa specifica.
Devi accedere o registrarti per scrivere nel forum
4 risposte