Resumo : neste tutorial, você aprenderá sobre UNIQUE
a 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 users
tabela ou os números de telefone dos clientes na customers
tabela devem ser exclusivos. Para impor esta regra, você usa uma UNIQUE
restrição.
Uma UNIQUE
restrição é uma restrição de integridade que garante a exclusividade dos valores em uma coluna ou grupo de colunas. Uma UNIQUE
restrição pode ser uma restrição de coluna ou uma restrição de tabela.
Para definir uma UNIQUE
restriçã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 UNIQUE
palavra-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 UNIQUE
restriçã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 UNIQUE
palavra-chave. Neste caso, o MySQL usará a combinação de valores em ambas as colunas column1
e column2
avaliará a exclusividade.
Se você definir uma UNIQUE
restrição sem especificar um nome, o MySQL gerará automaticamente um nome para ela. Para definir uma UNIQUE
restriçã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 UNIQUE
restrição após a CONSTRAINT
palavra-chave.
Exemplo de restrição UNIQUE do MySQL
Primeiro, cria uma nova tabela nomeada suppliers
com as duas UNIQUE
restriçõ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 UNIQUE
restrição é definida para a phone
coluna:
phone VARCHAR(12) NOT NULL UNIQUE
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A segunda UNIQUE
restrição inclui colunas name
e address
:
CONSTRAINT uc_name_address UNIQUE (name , address)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira uma linha na suppliers
tabela:
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 suppliers
tabela.
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 suppliers
tabela com valores que já existem nas colunas name
e 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 UNIQUE
restrição uc_name_address
foi 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 phone
coluna com uma restrição UNIQUE. Além disso, a phone
coluna pode aceitar valores NULL.
Segundo, insira algumas linhas na contacts
tabela:
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 contacts
tabela:
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 TABLE
declaração mostra a definição da suppliers
tabela:
SHOW CREATE TABLE suppliers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
A saída indica que o MySQL criou dois UNIQUE
índices na suppliers
tabela: phone
e uc_name_address
.
A SHOW INDEX
instrução a seguir exibe todos os índices associados à suppliers
tabela.
SHOW INDEX FROM suppliers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Elimine uma restrição exclusiva
Para eliminar uma UNIQUE
restrição, você pode usar a instrução DROP INDEX
or 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 suppliers
tabela:
DROP INDEX uc_name_address ON suppliers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Execute a SHOW INDEX
instrução novamente para verificar se a uc_name_unique
restrição foi removida.
SHOW INDEX FROM suppliers;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Adicionar nova restrição exclusiva
O seguinte ALTER TABLE ADD CONSTRAINT
adiciona 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 UNIQUE
restrição uc_name_address
de volta à suppliers
tabela:
ALTER TABLE suppliers
ADD CONSTRAINT uc_name_address
UNIQUE (name,address);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
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
UNIQUE
a restrição do MySQL para impor a exclusividade dos valores em uma coluna ou grupo de colunas de uma tabela.