Restrição MySQL NOT NULL

Resumo : neste tutorial, você aprenderá sobre NOT NULLas restrições do MySQL, incluindo a definição de uma NOT NULLrestrição para uma coluna, a adição de uma NOT NULLrestrição a uma coluna existente e a remoção de uma NOT NULLrestrição de uma coluna.

Introdução às restrições NOT NULL do MySQL

Uma NOT NULLrestrição garante que os valores armazenados em uma coluna não sejam NULL . A sintaxe para definir uma NOT NULLrestrição é a seguinte:

column_name data_type NOT NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Uma coluna pode ter apenas uma NOT NULLrestrição, o que impõe a regra de que a coluna não deve conter nenhum valor NULL.

Em outras palavras, se você tentar atualizar ou inserir um valor NULL em uma coluna NOT NULL, o MySQL emitirá um erro.

Por exemplo, o seguinte cria a taskstabela usando a CREATE TABLEinstrução:

CREATE TABLE tasks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Na taskstabela, definimos explicitamente as colunas titlee start_datecom NOT NULLrestrições.

A idcoluna possui a PRIMARY KEYrestrição, portanto, inclui implicitamente uma NOT NULLrestrição.

A end_datecoluna pode ter valores NULL, pois ao criar uma nova tarefa, você pode não saber sua data de conclusão

O seguinte mostra a estrutura da tabela de tarefas:

DESC tasks;

Saída:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| start_date | date         | NO   |     | NULL    |                |
| end_date   | date         | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)Linguagem de código:  PHP  ( php )

É uma boa prática ter a NOT NULLrestrição em todas as colunas de uma tabela, a menos que você tenha um motivo específico para não fazê-lo.

Geralmente, NULLos valores podem complicar suas consultas porque você precisa usar funções relacionadas a NULL, como ISNULL(), IFNULL()e NULLIF()para lidar com eles.

Adicionando uma restrição NOT NULL a uma coluna existente

Normalmente, você adiciona NOT NULLrestrições às colunas ao criar a tabela. No entanto, você pode querer adicionar uma NOT NULLrestrição a uma coluna de uma tabela existente. Nesse caso, você usa as seguintes etapas:

  1. Primeiro, verifique os valores atuais da coluna, se houver algum NULLvalor.
  2. Segundo, atualize o NULLpara não- NULL.
  3. Terceiro, modifique a coluna com uma NOT NULLrestrição.

Considere o seguinte exemplo.

Primeiro, insira algumas linhas  na taskstabela:

INSERT INTO tasks(title ,start_date, end_date)
VALUES('Learn MySQL NOT NULL constraint', '2017-02-01','2017-02-02'),
      ('Check and update NOT NULL constraint to your database', '2017-02-01',NULL);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Se desejar exigir que os usuários forneçam uma data de término estimada ao criar uma nova tarefa, você poderá adicionar uma restrição NOT NULL à end_datecoluna da taskstabela.

Segundo, encontre as linhas NULLsna coluna end_dateusando o IS NULLoperador:

SELECT * FROM tasks 
WHERE end_date IS NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+----+-------------------------------------------------------+------------+----------+
| id | title                                                 | start_date | end_date |
+----+-------------------------------------------------------+------------+----------+
|  2 | Check and update NOT NULL constraint to your database | 2017-02-01 | NULL     |
+----+-------------------------------------------------------+------------+----------+
1 row in set (0.00 sec)Linguagem de código:  PHP  ( php )

A consulta retornou uma linha NULLna coluna end_date.

Terceiro, atualize os NULLvalores para valores não nulos. Nesse caso, você pode criar uma regra que defina uma semana após a data de início quando end_date for NULL.

UPDATE tasks 
SET 
    end_date = start_date + 7
WHERE
    end_date IS NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Esta consulta verifica a atualização:

SELECT * FROM tasks;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+----+-------------------------------------------------------+------------+------------+
| id | title                                                 | start_date | end_date   |
+----+-------------------------------------------------------+------------+------------+
|  1 | Learn MySQL NOT NULL constraint                       | 2017-02-01 | 2017-02-02 |
|  2 | Check and update NOT NULL constraint to your database | 2017-02-01 | 2017-02-08 |
+----+-------------------------------------------------------+------------+------------+
2 rows in set (0.00 sec)Linguagem de código:  PHP  ( php )

Terceiro, adicione uma NOT NULLrestrição à end_datecoluna usando a seguinte ALTER TABLEinstrução:

ALTER TABLE table_name
CHANGE 
   old_column_name 
   new_column_name column_definition;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesse caso, os nomes das colunas antigas e novas são iguais, exceto que a coluna deve ter uma NOT NULLrestrição:

ALTER TABLE tasks 
CHANGE 
    end_date 
    end_date DATE NOT NULL;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Finalmente, verifique a mudança usando a DESCRIBEinstrução:

DESC tasks;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| start_date | date         | NO   |     | NULL    |                |
| end_date   | date         | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)Linguagem de código:  PHP  ( php )

Como você pode ver na saída, a NOT NULLrestrição foi adicionada à end_datecoluna com sucesso.

Removendo uma restrição NOT NULL

Para eliminar uma NOT NULLrestrição para uma coluna, você usa a ALTER TABLE..MODIFYinstrução:

ALTER TABLE table_name
MODIFY column_name column_definition;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Observe que a definição da coluna (column_definition) deve reafirmar a definição da coluna original sem a NOT NULLrestrição.

Por exemplo, a instrução a seguir remove a NOT NULLrestrição da end_datecoluna da taskstabela:

ALTER TABLE tasks 
MODIFY end_date DATE;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Esta é a estrutura da taskstabela:

DESC tasks;

Saída:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int          | NO   | PRI | NULL    | auto_increment |
| title      | varchar(255) | NO   |     | NULL    |                |
| start_date | date         | NO   |     | NULL    |                |
| end_date   | date         | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)Linguagem de código:  PHP  ( php )

Resumo

  • Use NOT NULLrestrição para garantir que uma coluna não contenha nenhum NULLvalor.
  • Use ALTER TABLE ... CHANGEa instrução para adicionar uma NOT NULLrestrição a uma coluna existente.
  • Use ALTER TABLE ... MODIFYpara eliminar uma NOT NULLrestrição de uma coluna.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *