Contents

5 Restrições SQL para garantir uma boa estrutura da base de dados

Principais lições

A utilização de restrições SQL é crucial para preservar a integridade de uma base de dados e, ao mesmo tempo, garantir a consistência do seu conteúdo. Uma dessas restrições é a restrição NOT NULL, que determina que as colunas não podem aceitar valores nulos, reforçando assim a importância de fornecer informações válidas nesses campos.

Para manter a integridade e a exatidão dos dados numa base de dados relacional, é importante implementar restrições de chave primária em colunas ou conjuntos de colunas específicos. Estes identificadores únicos evitam a duplicação de registos e promovem uma organização e recuperação eficientes da informação.

Os constrangimentos de chave externa servem para manter a integridade das bases de dados relacionais, impondo a integridade referencial, garantindo que cada registo numa tabela secundária corresponde a um registo existente na tabela principal. Estas restrições são essenciais para preservar a interligação dos dados em várias tabelas e impedir modificações ou eliminações não autorizadas que possam comprometer a exatidão e a consistência da base de dados como um todo.

Uma base de dados bem organizada é crucial para inúmeras funcionalidades, no entanto, sem protocolos estabelecidos para o armazenamento e manipulação de dados, pode instalar-se o caos.

As restrições SQL são utilizadas para estabelecer directrizes para o armazenamento de dados numa tabela específica. Estas restrições permitem que o sistema gere uma mensagem de erro quando se tenta inserir ou atualizar informações que contradizem os parâmetros estabelecidos. Ao impor estas regras, as bases de dados podem preservar a consistência dos dados e impor a adesão a normas em todas as tabelas.

Existem várias variedades de restrições SQL, que são altamente benéficas para garantir a integridade e a segurança dos dados numa base de dados.

Restrição NOT NULL

Por defeito, as colunas da base de dados permitem o armazenamento de valores nulos. Nulo representa a ausência de qualquer valor. Por outro lado, a restrição not-null determina que uma determinada coluna deve excluir valores nulos e, em vez disso, exigir um valor substantivo.

A declaração serve para impor a exigência de que cada linha de uma tabela deve ter uma entrada correspondente nas respectivas colunas não-nuláveis, que são designadas pela restrição “NOT NULL”. Por outras palavras, não é permitido inserir ou introduzir um novo registo na base de dados, a menos que todos os campos obrigatórios estejam preenchidos com dados, uma vez que, se tal não acontecer, será gerado um erro.

Considere um caso em que uma representação tabular da clientela é considerada imperativa para fins organizacionais. Nesse caso, pode ser prudente incluir na base de dados certas informações indispensáveis relativas a cada cliente, sendo um desses detalhes fundamentais a nomenclatura do cliente. Para garantir a conformidade com os requisitos de introdução de dados, a implementação de uma restrição conhecida como “NOT NULL” pode ser aplicada a estes atributos obrigatoriamente incluídos, assegurando assim que nenhuma conta de cliente existirá sem fornecer esta informação de identificação crucial.

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255) NOT NULL,
    Mobile_No int NOT NULL,
    Age int
);

Se se tentar inserir um registo de cliente sem o campo Idade, a base de dados deve reconhecer essa tentativa sem gerar qualquer mensagem de erro:

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 723000000); 

Embora seja possível tentar inserir um registo sem a inclusão do campo “FirstName”, o sistema de base de dados gera uma mensagem de erro em resposta:

 ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 723000000, null). 

PRIMARY KEY Constraint

Uma chave primária é um elemento essencial em qualquer sistema de gestão de bases de dados relacionais, servindo como um identificador distinto para cada entrada dentro de uma tabela específica. Esta designação garante a singularidade e individualidade dos dados contidos na(s) referida(s) coluna(s), impedindo a duplicação e mantendo a organização e integridade de toda a informação armazenada.

Em todas as bases de dados relacionais, uma chave primária é um componente essencial que consiste em valores distintos e não pode acomodar nulos. Um princípio fundamental de estruturação de tabelas afirma que cada tabela deve possuir apenas uma chave primária. Esta chave primária pode ser composta por uma única coluna ou por várias colunas, conhecidas coletivamente como chaves primárias compostas.

Ao criar uma base de dados com informações sobre os clientes, é essencial estabelecer códigos de identificação únicos para cada cliente. Para atingir este objetivo, pode-se implementar o conceito de uma restrição de chave primária, que garante que não há dois clientes com números de identificação idênticos.

Para implementar uma restrição de chave primária numa base de dados MySQL, pode consultar-se o seguinte código de exemplo:

 CREATE TABLE Customers (
    ID int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int,
   PRIMARY KEY (ID)
); 

A base de dados rejeitará qualquer tentativa de um utilizador de submeter dados que contenham um identificador duplicado. Caso tal ocorra, será levantada uma exceção que indica a existência de informação duplicada. No cenário apresentado, o indivíduo tenta adicionar dois registos com o mesmo número de identificação:

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );

 INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 ); 

A base de dados apresenta uma mensagem de erro:

 Duplicate entry '1' for key 'PRIMARY' 

A implementação de uma chave primária serve para evitar a ocorrência de valores de identificação duplicados num determinado conjunto de dados, como evidenciado pelo facto de que a alteração do identificador único atribuído a um determinado registo resultará na rejeição de uma tentativa de operação de inserção ou atualização pelo sistema de base de dados. Esta função é particularmente importante para manter a integridade dos dados e evitar incoerências quando se trata de grandes colecções de informação, como as que se encontram nos registos dos clientes.

FOREIGN KEY Constraint

As chaves estrangeiras servem como meio de criar associações entre duas tabelas, referenciando a chave primária de uma tabela numa tabela secundária ou relacionada. Isto permite uma ligação e interdependência entre os dados contidos nestas entidades separadas, facilitando o estabelecimento de ligações e conexões através de pontos comuns partilhados.

A relação entre duas tabelas numa base de dados relacional pode ser estabelecida através da utilização de chaves primárias e estrangeiras. Neste contexto, a tabela que serve de fonte primária de dados e possui um identificador único para cada registo é designada por tabela “mãe”, enquanto a tabela que se baseia em informações de outra tabela para estabelecer os seus próprios registos é conhecida por tabela “filha”. Por conseguinte, qualquer entrada registada na tabela filha deve corresponder a um registo existente na tabela mãe, servindo como meio de associação e validação.

A implementação de uma restrição de chave estrangeira garante a preservação das relações entre tabelas de bases de dados interligadas, proibindo qualquer operação que possa comprometer essas ligações. Especificamente, a eliminação ou remoção de uma tabela que serve como chave estrangeira para outra tabela é restrita, necessitando do encerramento simultâneo de ambas as tabelas relacionadas para evitar perturbar a sua associação.

Ao contrário de uma chave primária, que é única numa tabela, as chaves estrangeiras podem existir em várias instâncias numa única tabela e podem conter valores nulos. Por exemplo, na ilustração fornecida, a criação de uma encomenda requer a utilização do valor da chave externa customer\_id.

 CREATE TABLE Customers (
    customer_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);

INSERT INTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');

INSERT INTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07'); 

Ao tentar gerar uma transação sem um identificador pré-existente para o cliente, o sistema apresentará uma notificação de erro.

 Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`)) 

Restrição UNIQUE

Uma restrição exclusiva é um mecanismo em bancos de dados relacionais que garante a exclusividade dos valores de uma coluna específica em todas as linhas de uma tabela. Semelhante às chaves primárias, esta restrição mantém a consistência dos dados, impedindo a duplicação de informações. A não implementação desta restrição pode resultar numa base de dados desorganizada que requer intervenção manual para identificar e remover registos redundantes.

É possível utilizar várias restrições UNIQUE numa única tabela, em contraste com uma única CHAVE PRIMÁRIA, como demonstrado pela criação de uma tabela “Clientes” com identificadores e números de telefone distintos. A implementação de tal restrição é executada através do emprego da sintaxe subsequente no sistema de gestão de base de dados MySQL:

 CREATE TABLE Customers (
    ID int NOT NULL UNIQUE,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

Nos casos em que são feitas várias entradas numa base de dados utilizando números de telefone idênticos, será gerada uma notificação de erro para indicar tal duplicação.

 INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 254000000 );

INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (7891011, 'Dedan', 'Kimathi', 254000000 ); 

A notificação ou alerta gerado em resposta a uma tentativa de início de sessão mal sucedida, que inclui informações sobre a conta de utilizador e quaisquer privilégios associados, segue normalmente um formato normalizado que consiste em detalhes específicos, como a data e a hora da tentativa de autenticação falhada, o nome de utilizador ou o nome da conta associada à tentativa, uma breve descrição da natureza da falha (por exemplo, palavra-passe incorrecta fornecida) e instruções relevantes, palavra-passe incorrecta fornecida) e instruções relevantes para a resolução do problema

 Duplicate entry '254000000' for key 'Mobile_No' 

A restrição UNIQUE, que é um tipo específico de restrição de base de dados, garante que não existem dois registos na base de dados que possuam valores idênticos para os campos de ID de cliente ou número de telemóvel.

Restrição CHECK

Uma restrição CHECK serve para regular o intervalo permitido de valores que podem ser introduzidos numa determinada coluna, mantendo assim a integridade e autenticidade gerais dos dados nela armazenados. Ao impor tais restrições a uma coluna específica, é possível restringi-la para aceitar apenas os valores que foram explicitamente sancionados, fornecendo assim uma camada adicional de segurança contra quaisquer potenciais discrepâncias ou entradas não autorizadas.

A restrição CHECK requer que cada linha ou registo designado na tabela especificada seja avaliado como verdadeiro ou desconhecido. No caso de uma avaliação falsa, a base de dados apresentará uma notificação de erro.

Para restringir o acesso a determinados registos de clientes com base na idade, é possível utilizar uma restrição de verificação na tabela Clientes de um determinado sistema de gestão de bases de dados relacionais, como o PostgreSQL. Esta restrição exigiria que todos os indivíduos que procuram um serviço tivessem pelo menos dezoito anos de idade, impedindo assim quaisquer tentativas de prestação de serviços a menores. Uma ilustração deste conceito é fornecida abaixo sob a forma de código SQL:

 CREATE TABLE Customers (
    ID int NOT NULL,
    Age int CHECK(Age>=18),
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Mobile_No BIGINT UNIQUE
 ); 

Se alguém tentar introduzir a idade de um cliente abaixo do limiar dos 18 anos,

 INSERT INTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 1254000000 ); 

A base de dados pode apresentar uma notificação indicando que existe um problema, que pode assemelhar-se ao seguinte formato:

 ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 1254000000) 

Como adicionar e remover restrições SQL de bancos de dados

A flexibilidade proporcionada pelas restrições SQL é um recurso valioso, pois elas podem ser modificadas por meio da utilização da instrução ALTER TABLE. Esse comando versátil permite que os usuários façam ajustes nas restrições de suas tabelas para acomodar as mudanças nos requisitos de dados.

Para além das restrições SQL aqui mencionadas, existe uma vasta gama de restrições que pode ser explorada para criar uma base de dados personalizada. Começar com as descritas neste artigo seria um ponto de partida adequado.