Restrição ÚNICA do MySQL – 02

Resumo : neste tutorial, você aprenderá sobre UNIQUEa restrição do MySQL e como usá-la para impor a exclusividade de valores em uma coluna ou grupo de colunas em uma tabela.

Introdução à restrição UNIQUE do MySQL

Às vezes, você deseja garantir que os valores em uma coluna ou grupo de colunas sejam exclusivos. Por exemplo, os endereços de e-mail dos usuários na userstabela ou os números de telefone dos clientes na customerstabela devem ser exclusivos. Para impor esta regra, você usa uma UNIQUErestrição.

Uma UNIQUErestrição é uma restrição de integridade que garante a exclusividade dos valores em uma coluna ou grupo de colunas. Uma UNIQUErestrição pode ser uma restrição de coluna ou uma restrição de tabela.

Para definir uma UNIQUErestrição para uma coluna ao criar uma tabela , você usa a seguinte sintaxe:

CREATE TABLE table_name(
    ...,
    column1 datatype UNIQUE,
    ...
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, você inclui a UNIQUEpalavra-chave na definição da coluna cuja exclusividade deseja impor.

Se você inserir ou atualizar um valor que cause uma duplicação no arquivo column1, o MySQL rejeitará a alteração e emitirá um erro.

Esta UNIQUErestrição é uma restrição de coluna. E você pode usá-lo para impor a regra exclusiva para uma coluna.

Para definir uma UNIQUE  restrição para duas ou mais colunas, use a seguinte sintaxe:

CREATE TABLE table_name(
   ...
   column1 datatype,
   column2 datatype,
   ...,
   UNIQUE(column1, column2)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, você adiciona uma lista de colunas separadas por vírgulas entre parênteses após a UNIQUEpalavra-chave. Neste caso, o MySQL usará a combinação de valores em ambas as colunas column1e column2avaliará a exclusividade.

Se você definir uma UNIQUErestrição sem especificar um nome, o MySQL gerará automaticamente um nome para ela. Para definir uma UNIQUErestrição com um nome, você usa esta sintaxe:

[CONSTRAINT constraint_name]
UNIQUE(column_list)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, você especifica o nome da UNIQUErestrição após a CONSTRAINTpalavra-chave.

Exemplo de restrição UNIQUE do MySQL

Primeiro, cria uma nova tabela nomeada supplierscom as duas UNIQUErestrições:

CREATE TABLE suppliers (
    supplier_id INT AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    phone VARCHAR(15) NOT NULL UNIQUE,
    address VARCHAR(255) NOT NULL,
    PRIMARY KEY (supplier_id),
    CONSTRAINT uc_name_address UNIQUE (name,address)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Neste exemplo, a primeira UNIQUErestrição é definida para a phonecoluna:

phone VARCHAR(12) NOT NULL UNIQUELinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A segunda UNIQUErestrição inclui colunas namee address:

CONSTRAINT uc_name_address UNIQUE (name , address)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira uma linha na supplierstabela:

INSERT INTO suppliers(name, phone, address) 
VALUES( 'ABC Inc', 
       '(408)-908-2476',
       '4000 North 1st Street');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, tente inserir um fornecedor diferente, mas que possua o número de telefone que já existe na supplierstabela.

INSERT INTO suppliers(name, phone, address) 
VALUES( 'XYZ Corporation','(408)-908-2476','3000 North 1st Street');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

MySQL emitiu o seguinte erro:

Error Code: 1062. Duplicate entry '(408)-908-2476' for key 'phone'Linguagem de código:  JavaScript  ( javascript )

Quarto, altere o número de telefone para um diferente e execute a instrução insert novamente.

INSERT INTO suppliers(name, phone, address) 
VALUES( 'XYZ Corporation','(408)-908-3333','3000 North 1st Street');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quinto, insira uma linha na supplierstabela com valores que já existem nas colunas namee address:

INSERT INTO suppliers(name, phone, address) 
VALUES( 'ABC Inc', 
       '(408)-908-1111',
       '4000 North 1st Street');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

O MySQL emitiu um erro porque a UNIQUErestrição uc_name_addressfoi violada.

Error Code: 1062. Duplicate entry 'ABC Inc-4000 North 1st Street' for key 'uc_name_address'Linguagem de código:  JavaScript  ( javascript )

Restrição UNIQUE do MySQL e NULL

No MySQL, os valores NULL são tratados como distintos quando se trata de restrições exclusivas. Portanto, se você tiver uma coluna que aceita valores NULL, poderá inserir vários valores na coluna.

Primeiro, crie uma nova tabela chamada contacts:

CREATE TABLE contacts(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    phone VARCHAR(20) UNIQUE
)Linguagem de código:  PHP  ( php )

A tabela de contatos possui uma phonecoluna com uma restrição UNIQUE. Além disso, a phonecoluna pode aceitar valores NULL.

Segundo, insira algumas linhas na contactstabela:

INSERT INTO contacts(name, phone)
VALUES
   ('Alice','(408)-102-2456'),
   ('John', NULL),
   ('Jane', NULL);   Linguagem de código:  PHP  ( php )

Neste exemplo, podemos inserir dois valores NULL na coluna de telefone sem causar duplicação.

Terceiro, recupere os dados da contactstabela:

SELECT * FROM contacts;

Saída:

+----+-------+----------------+
| id | name  | phone          |
+----+-------+----------------+
|  1 | Alice | (408)-102-2456 |
|  2 | John  | NULL           |
|  3 | Jane  | NULL           |
+----+-------+----------------+
3 rows in set (0.00 sec)Linguagem de código:  PHP  ( php )

Restrições e índices UNIQUE do MySQL

Quando você define uma restrição exclusiva para uma coluna ou grupo de colunas, o MySQL cria um UNIQUEíndice correspondente e usa esse índice para impor a regra.

A SHOW CREATE TABLEdeclaração mostra a definição da supplierstabela:

SHOW CREATE TABLE suppliers;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Restrição e índice UNIQUE do MySQL

A saída indica que o MySQL criou dois UNIQUEíndices na supplierstabela: phonee uc_name_address.

A SHOW INDEXinstrução a seguir exibe todos os índices associados à supplierstabela.

SHOW INDEX FROM suppliers;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Exemplo de restrição UNIQUE do MySQL

Elimine uma restrição exclusiva

Para eliminar uma UNIQUErestrição, você pode usar a instrução DROP INDEXor ALTER TABLE:

DROP INDEX index_name ON table_name;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
ALTER TABLE table_name
DROP INDEX index_name;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Por exemplo, a instrução a seguir elimina a uc_name_address restrição da supplierstabela:

DROP INDEX uc_name_address ON suppliers;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Execute a SHOW INDEXinstrução novamente para verificar se a uc_name_uniquerestrição foi removida.

SHOW INDEX FROM suppliers;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL Remover exemplo de restrição UNIQUE

Adicionar nova restrição exclusiva

O seguinte ALTER TABLE ADD CONSTRAINTadiciona uma restrição exclusiva a uma coluna de uma tabela existente:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name 
UNIQUE (column_list);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Esta instrução adiciona uma UNIQUErestrição uc_name_addressde volta à supplierstabela:

ALTER TABLE suppliers
ADD CONSTRAINT uc_name_address 
UNIQUE (name,address);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Exemplo de restrição UNIQUE do MySQL

Observe que o MySQL não adicionará uma restrição exclusiva se os dados existentes nas colunas especificadas na restrição exclusiva não estiverem em conformidade com a regra de exclusividade.

Resumo

  • Use UNIQUEa restrição do MySQL para impor a exclusividade dos valores em uma coluna ou grupo de colunas de uma tabela.

Deixe um comentário

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