Uma chave primária garante a unicidade dos registros e proíbe valores nulos. Em contraste, uma restrição única permite valores nulos, mas impede duplicatas.
- Chave Primária Simples
Ao definir uma coluna como chave primária, valores duplicados ou nulos são rejeitados.
CREATE TABLE funcionarios (
cod_func INT PRIMARY KEY,
nome_func VARCHAR(30)
);
DESC funcionarios;
Tentativas de inserir valores duplicados na chave primária resultam em erro:
INSERT INTO funcionarios VALUES (1, 'Ana');
-- Sucesso
INSERT INTO funcionarios VALUES (1, 'Carlos');
-- Erro: entrada duplicada
Valores em colunas não-chave podem ser repetidos:
INSERT INTO funcionarios VALUES (2, 'Ana');
SELECT * FROM funcionarios;
A coluna chave primária não aceita nulos, mas outras colunas podem:
INSERT INTO funcionarios VALUES (NULL, 'Ana');
-- Erro: coluna não pode ser nula
INSERT INTO funcionarios VALUES (3, NULL);
SELECT * FROM funcionarios;
- Chave Primária Composta
Uma chave primária composta combina duas ou mais colunas. A combinação completa deve ser única, mas individualmente podem ter valores repetidos.
CREATE TABLE pedidos (
id_pedido INT,
cod_produto INT,
descricao VARCHAR(50),
PRIMARY KEY (id_pedido, cod_produto)
);
DESC pedidos;
Inserções são permitidas se ao menos uma das colunas chave diferir:
INSERT INTO pedidos VALUES (1, 101, 'Item A');
INSERT INTO pedidos VALUES (2, 101, 'Item B');
INSERT INTO pedidos VALUES (1, 102, 'Item C');
SELECT * FROM pedidos;
Nenhuma das colunas chave pode ser nula:
INSERT INTO pedidos VALUES (NULL, 103, 'Item D');
-- Erro: coluna não pode ser nula
- Auto-incremento
A propriedade AUTO_INCREMENT gera automaticamente valores sequenciais para a chave primária.
CREATE TABLE usuarios (
id_usuario INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20)
);
DESC usuarios;
Ao omitir a chave primária na inserção, valores são gerados a partir de 1:
INSERT INTO usuarios (username) VALUES ('maria');
INSERT INTO usuarios (username) VALUES ('joao');
INSERT INTO usuarios (username) VALUES ('ana');
SELECT * FROM usuarios;
Se um valor explícito for fornecido, a sequência continua a partir dele:
DELETE FROM usuarios WHERE username = 'ana';
INSERT INTO usuarios VALUES (100, 'pedro');
INSERT INTO usuarios (username) VALUES ('lucia');
INSERT INTO usuarios (username) VALUES ('carlos');
SELECT * FROM usuarios;
- Adicionar e Remover Chave Primária após Criação
É possível modificar a chave primária de uma tabela existente.
CREATE TABLE clientes (
id_cliente INT,
nome VARCHAR(25)
);
DESC clientes;
Adicionar chave primária:
ALTER TABLE clientes ADD PRIMARY KEY (id_cliente);
DESC clientes;
Remover chave primária:
ALTER TABLE clientes DROP PRIMARY KEY;
DESC clientes;
Para chaves compostas, o processo é análogo:
ALTER TABLE clientes ADD PRIMARY KEY (id_cliente, nome);
DESC clientes;
ALTER TABLE clientes DROP PRIMARY KEY;
DESC clientes;
Também pode-se usar ALTER TABLE MODIFY para definir a chave primária:
ALTER TABLE clientes MODIFY id_cliente INT PRIMARY KEY;
DESC clientes;
- Restrição Única
Uma restrição única impede duplicatas em uma coluna, mas permite valores nulos.
5.1 Adicionar após Criação
CREATE TABLE produtos (
cod_prod INT,
nome_prod VARCHAR(30)
);
ALTER TABLE produtos ADD UNIQUE (nome_prod);
DESC produtos;
Valores duplicados na coluna única são rejeitados:
INSERT INTO produtos VALUES (1, 'Monitor');
INSERT INTO produtos VALUES (2, 'Monitor');
-- Erro: entrada duplicada
INSERT INTO produtos VALUES (3, 'Teclado');
INSERT INTO produtos VALUES (4, NULL);
SELECT * FROM produtos;
5.2 Definir na Criação
CREATE TABLE categorias (
id_categoria INT,
descricao VARCHAR(40) UNIQUE
);
DESC categorias;
5.3 Restrição Única Composta
CREATE TABLE estoque (
id_item INT,
nome_item VARCHAR(20),
UNIQUE (id_item, nome_item)
);
DESC estoque;
Inserções são permitidas se a combinação for única:
INSERT INTO estoque VALUES (1, 'Parafuso');
INSERT INTO estoque VALUES (2, 'Parafuso');
SELECT * FROM estoque;
5.4 Remover Restrição Única
ALTER TABLE categorias DROP INDEX descricao;
DESC categorias;
5.5 Modificar Restrição Única
ALTER TABLE categorias MODIFY descricao VARCHAR(40) UNIQUE;
DESC categorias;
- Restrição NOT NULL
A restrição NOT NULL exige que uma coluna tenha valores, proibindo nulos.
CREATE TABLE fornecedores (
id_fornecedor INT,
nome_fornecedor VARCHAR(25) NOT NULL
);
DESC fornecedores;
Inserções sem valor para a coluna NOT NULL falham:
INSERT INTO fornecedores (id_fornecedor) VALUES (1);
-- Erro: campo não tem valor padrão
INSERT INTO fornecedores VALUES (2, 'FornecedorA');
INSERT INTO fornecedores (nome_fornecedor) VALUES ('FornecedorB');
SELECT * FROM fornecedores;
- Restrição DEFAULT
A restrição DEFAULT atribui um valor padrão quando nenhum é especificado na inserção.
CREATE TABLE configuracoes (
id_config INT,
nome VARCHAR(30),
valor_padrao INT DEFAULT 0
);
INSERT INTO configuracoes (id_config, nome) VALUES (1, 'Timeout');
SELECT * FROM configuracoes;
- Restrição de Chave Estrangeira
Uma chave estrangeira vincula uma coluna a uma chave primária em outra tabela, garantindo integridade referencial.
CREATE TABLE departamentos (
id_dep INT PRIMARY KEY,
nome_dep VARCHAR(20)
);
CREATE TABLE empregados (
id_emp INT PRIMARY KEY,
nome_emp VARCHAR(30),
id_dep INT,
FOREIGN KEY (id_dep) REFERENCES departamentos (id_dep)
);
DESC departamentos;
DESC empregados;
Inserções em deaprtamentos:
INSERT INTO departamentos VALUES (10, 'TI');
INSERT INTO departamentos VALUES (20, 'RH');
INSERT INTO departamentos VALUES (30, 'Financeiro');
SELECT * FROM departamentos;
A chave estrangeira impede referências a valores inexistnetes na tabela principal:
INSERT INTO empregados VALUES (101, 'João', 10);
INSERT INTO empregados VALUES (102, 'Maria', 20);
INSERT INTO empregados VALUES (103, 'Pedro', 40);
-- Erro: restrição de chave estrangeira
SELECT * FROM empregados;
Registros na tabela principal não podem ser excluídos se estiverem referenciados:
DELETE FROM departamentos WHERE id_dep = 10;
-- Erro: operação não permitida devido à restrição