Restrições de integridade em SQL: Um guia com exemplos
As restrições de integridade no SQL são regras aplicadas às tabelas do banco de dados para manter a precisão, a consistência e a validade dos dados, como garantir chaves primárias exclusivas e relacionamentos válidos de chave estrangeira.
Imagine um banco de dados hospitalar em que as alergias dos pacientes não podem ser deixadas em branco ou um sistema financeiro em que os valores das transações devem ser números positivos. Nesses cenários e em inúmeros outros, contamos com restrições de integridade para garantir que nossos dados permaneçam precisos, consistentes e confiáveis.
Em SQL, as restrições de integridade são regras que impomos às tabelas de nosso banco de dados para manter a qualidade dos dados. Eles ajudam a evitar erros, aplicam regras comerciais e garantem que nossos dados reflitam as entidades e os relacionamentos do mundo real que eles representam.
Neste artigo, vamos nos aprofundar nos tipos essenciais de restrições de integridade em SQL, fornecendo explicações claras e exemplos práticos para ilustrar seu uso em um banco de dados PostgreSQL. Embora usemos a sintaxe do PostgreSQL, os conceitos são facilmente traduzidos para outros dialetos SQL.
Se você quiser saber mais sobre SQL, confira esta lista de cursos de SQL.
O que são restrições de integridade no SQL?
Considere um cenário em que temos uma tabela que armazena informações do usuário para um aplicativo da Web. Alguns dados, como a idade do usuário, podem ser opcionais porque não impedem que os usuários acessem nosso aplicativo. No entanto, ter uma senha para cada usuário é essencial para fins de login. Para resolver isso, implementaríamos uma restrição de integridade na coluna de senha da tabela do nosso usuário para garantir que cada entrada nessa tabela inclua uma senha.
Em essência, as restrições de integridade são cruciais para:
Evitar a falta de dados.
Garantir que todos os dados estejam de acordo com os tipos e intervalos de valores esperados.
Manter links adequados entre os dados de diferentes tabelas.
Neste artigo, exploraremos as seguintes restrições de integridade essenciais no SQL:
PRIMARY KEY: Identifica de forma exclusiva cada registro em uma tabela.
NOT NULL: Garante que uma coluna não possa conter valores NULL.
UNIQUE: Garante que todos os valores em uma coluna ou grupo de colunas sejam exclusivos.
DEFAULT: Fornece um valor padrão para uma coluna quando nenhum é especificado.
CHECK: Garante que todos os valores em uma coluna satisfaçam uma condição específica.
FOREIGN KEY: Estabelece relações entre tabelas ao fazer referência a uma chave primária em outra tabela.
Caso de estudo: Banco de dados da universidade
Vamos considerar um banco de dados relacional para uma universidade. Esse banco de dados contém três tabelas: students, courses, e enrollments.
Tabela de alunos
A tabela students contém informações sobre todos os estudantes universitários.
student_id: O identificador do aluno
first_name: O primeiro nome do aluno.
last_name: O sobrenome do aluno.
email: O endereço de e-mail do aluno.
major: O curso do aluno.
enrollment_year: O ano em que o aluno se matriculou.
Tabela de cursos
Na tabela courses você encontra informações sobre os cursos disponíveis na universidade.
course_id: O identificador do curso.
course_name: O nome do curso.
department: O departamento do curso.
Tabela de registros
A tabela enrollments armazena informações sobre quais alunos estão matriculados em quais cursos.
student_id: O identificador do aluno matriculado no curso.
course_id: O identificador do curso.
year: O ano da matrícula.
grade: A nota do aluno nesse curso.
is_passing_grade: Um booleano que indica se a nota está sendo aprovada.
Ao longo deste artigo, usaremos esse banco de dados de exemplo e mostraremos várias maneiras de impor a integridade dos dados. Usaremos a sintaxe do PostgreSQL em nossas consultas. No entanto, os conceitos são facilmente traduzidos para outros tipos de SQL.
Restrição PRIMARY KEY
O objetivo da universidade é identificar cada aluno de forma exclusiva. Não é aconselhável utilizar o nome e o sobrenome para essa finalidade devido à possibilidade de duplicação de nomes entre os alunos. Da mesma forma, confiar em endereços de e-mail não é o ideal, pois os alunos podem mudar seus e-mails.
A solução comum para garantir a identificação exclusiva é atribuir um identificador exclusivo a cada aluno, que é armazenado na coluna student_id. Podemos aplicar uma restrição PRIMARY KEY à coluna student_id para garantir que cada aluno tenha um identificador exclusivo.
Essa restrição é definida no comando CREATE TABLE, após a especificação do tipo de dados da coluna:
CREATETABLE students (
student_id INTPRIMARYKEY,
first_name TEXT,
last_name TEXT,
email TEXT,
major TEXT,
enrollment_year INT);Tecnologia
A consulta acima cria a tabela de alunos com as seis colunas que mencionamos acima.
A restrição PRIMARY KEY garante que você não terá problemas:
Cada aluno tem um student_id.
Cada student_id é único.
Restrição PRIMARY KEY em várias colunas
Em determinados cenários, precisamos utilizar várias colunas para identificar cada linha de forma exclusiva. Veja, por exemplo, a tabela enrollments. Um aluno pode se inscrever em vários cursos, o que resulta em várias linhas que compartilham o mesmo student_id. Da mesma forma, um curso pode ter vários alunos inscritos, o que resulta em várias linhas com o mesmo course_id.
Como nenhum campo individual pode identificar exclusivamente uma linha, cada registro de inscrição é determinado usando uma combinação de student_id, course_id e year.
Quando várias colunas estão envolvidas, a restrição PRIMARY KEY é especificada no final do comando CREATE TABLE.
Restrições de integridade após a criação da tabela
Há duas maneiras de adicionar restrições de integridade. Acabamos de aprender como fazer isso quando a tabela é criada.
Imagine que a tabela já existe, mas você esqueceu de especificar a restrição PRIMARY KEY. Você também pode defini-lo depois que a tabela for criada usando o comando ALTER TABLE, da seguinte forma:
Na consulta ALTER TABLE, chamamos a restrição de enroll_pk (que significa chave primária de registro). Esse nome pode ser qualquer identificador que você escolher, mas é recomendável selecionar um nome que transmita de forma sucinta o objetivo da restrição.
É uma prática recomendada nomear as restrições de integridade, pois isso proporciona vários benefícios:
Isso permite uma referência mais fácil, especialmente quando você precisar modificar ou eliminar a restrição no futuro.
Ele oferece suporte ao gerenciamento e à organização de restrições, especialmente em bancos de dados com um grande número de restrições.
Restrição NOT NULL
A universidade quer garantir que o nome e o e-mail de cada aluno sejam registrados no banco de dados. Eles não querem que a equipe se esqueça de inserir qualquer um desses campos acidentalmente.
Para superar isso, podemos usar as restrições NOT NULL nessas três colunas ao criar a tabela:
CREATETABLE students (
student_id INT,
first_name TEXTNOTNULL,
last_name TEXTNOTNULL,
email TEXTNOTNULL,
major TEXT,
enrollment_year INT);Tecnologia
A consulta acima usa as restrições NOT NULL para garantir que as colunas first_name, last_name e email não possam ter valores NULL (indefinidos).
Você pode adicionar uma restrição NOT NULL a uma tabela existente usando o comando ALTER TABLE. A sintaxe para adicionar as restrições do site NOT NULL é a seguinte:
ALTERTABLE students
ALTERCOLUMN first_name SETNOTNULL,ALTERCOLUMN last_name SETNOTNULL,ALTERCOLUMN email SETNOTNULL;Tecnologia
Restrição UNIQUE
Os endereços de e-mail são inerentemente exclusivos para cada indivíduo. Em situações em que temos certeza de que um campo nunca deve ter valores duplicados, é uma boa prática impor isso em um nível de banco de dados. Isso ajuda a evitar erros e a garantir a integridade dos dados.
A adição dessa restrição é feita da mesma forma que as outras.
CREATETABLE students (...
email TEXTUNIQUE,...);Tecnologia
No entanto, em nosso caso, também queremos impor a restrição NOT NULL. Podemos impor várias restrições em uma única coluna separando-as por espaço:
CREATETABLE students (...
email TEXTUNIQUENOTNULL,...);Tecnologia
Observe que a ordem não importa, pois também poderíamos ter usado NOT NULL UNIQUE.
Para adicionar uma restrição UNIQUE a uma tabela existente, você deve fazer o seguinte:
ALTERTABLE students
ADDCONSTRAINT unique_emails UNIQUE(email);Tecnologia
Restrição UNIQUE em várias colunas
Suponhamos que você queira garantir que o nome do curso de cada departamento seja exclusivo na tabela courses. Nesse caso, as colunas course_name e department juntas devem ser exclusivas.
Quando várias colunas estão envolvidas, a restrição é adicionada ao final do comando CREATE TABLE:
CREATETABLE courses (
course_id INT,
course_name TEXT,
department TEXT,UNIQUE(course_name, department));Tecnologia
Como alternativa, podemos adicionar a restrição alterando uma tabela existente. Nesse caso, fornecemos uma tupla com os nomes das colunas:
A diferença entre NOT NULL UNIQUE e PRIMARY KEY em uma tabela é a finalidade e o uso pretendidos.
Embora ambos imponham a exclusividade e a não nulidade em uma ou mais colunas, uma tabela só pode ter um PRIMARY KEY, que se destina a identificar exclusivamente cada registro na tabela.
Por outro lado, a restrição de combinação NOT NULL UNIQUE pode ser aplicada a colunas adicionais para impor um valor exclusivo em cada linha, sem valores nulos, servindo para manter a integridade dos dados para regras comerciais específicas. Uma tabela pode ter qualquer número de restrições NOT NULL UNIQUE.
A existência de ambos permite maior flexibilidade no design do banco de dados, possibilitando várias maneiras de impor a exclusividade e a integridade dos dados e, ao mesmo tempo, distinguir entre o identificador primário de um registro e outros atributos importantes e exclusivos de uma tabela.
Restrição DEFAULT
Os alunos podem precisar de algum tempo após a matrícula na universidade para selecionar sua área de especialização. A universidade gostaria que o valor da coluna major fosse a string "Undeclared" (não declarado) para os alunos que ainda não selecionaram sua especialização.
Para isso, podemos definir um valor padrão para essa coluna usando a restrição DEFAULT. Você pode alterar a tabela de alunos da seguinte forma:
ALTERTABLE students
ALTERCOLUMN major SETDEFAULT'Undeclared';Tecnologia
Se, em vez disso, quisermos definir uma restrição DEFAULT quando a tabela for criada, você poderá fazer isso declarando-a após o tipo de dados da coluna:
CREATETABLE students (...
major TEXTDEFAULT'Undeclared',...);Tecnologia
Restrição CHECK
Nessa universidade em particular, as notas vão de 0 a 100. Sem nenhuma restrição, a coluna grade da tabela enrollment aceita qualquer valor inteiro. Podemos corrigir isso usando uma restrição CHECK para impor que os valores estejam entre 0 e 100.
Em geral, as restrições do CHECK nos permitem validar condições específicas que queremos que os dados satisfaçam. Isso é importante para garantir a consistência e a integridade dos dados.
Uma restrição CHECK pode envolver mais de uma coluna. Vamos usá-lo para garantir que grade e is_passing_grade tenham valores consistentes. Digamos que uma nota seja aprovada se seu valor for de pelo menos 60. Então, podemos garantir que is_passing_grade é TRUE se e somente se a nota for de pelo menos 60. Vamos fazer isso na criação da tabela para mostrar como as restrições CHECK são declaradas no comando CREATE TABLE:
Há um problema com a restrição acima. Quando um aluno se matricula em um curso, ele ainda não tem uma nota. Portanto, devemos permitir valores de NULL na nota. Ao fazer isso, também precisamos atualizar a restrição de nota de aprovação para que seja NULL quando a nota ainda estiver indefinida. Veja como você pode atualizar a restrição para levar isso em consideração:
Observe que, nas colunas grade e is_passing_grade, adicionamos NULL no tipo de dados e como valor padrão. O objetivo deles é simplesmente aumentar a legibilidade.
Vamos ver agora quais condições podemos impor com uma restrição CHECK.
Condições de alcance
Podemos garantir que os valores em uma coluna estejam dentro de um intervalo específico.
ALTERTABLE table_name
ADDCONSTRAINT constraint_name
CHECK(column_name BETWEEN min_value AND max_value);Tecnologia
Listar condições
Podemos validar se o valor de uma coluna corresponde a um valor em uma lista de valores específicos.
As restrições de chave estrangeira são usadas para vincular as colunas de duas tabelas, garantindo a integridade referencial dos dados. Em essência, uma chave estrangeira em uma tabela aponta para uma chave primária em outra tabela, indicando que as linhas nessas duas tabelas estão relacionadas. Isso garante que você não possa ter uma linha em uma tabela com uma chave estrangeira que não corresponda a nenhuma linha na tabela vinculada com a chave primária.
Em nosso exemplo, cada registro na tabela de matrículas refere-se a um aluno e a um curso por meio das colunas student_id e course_id, respectivamente. Sem nenhuma restrição, não há nada que garanta que os valores desses identificadores na tabela de matrículas correspondam às entradas existentes nas tabelas de alunos e cursos.
Veja como garantimos isso quando criamos a tabela enrollments:
Ao longo deste artigo, apresentamos várias restrições de integridade e como usá-las para aprimorar um banco de dados universitário. Aqui está a versão final do comando CREATE TABLE, que combina tudo o que aprendemos.
Primeiro, definiremos a tabela students:
CREATETABLE students (
student_id INTPRIMARYKEY,
first_name TEXTNOTNULL,
last_name TEXTNOTNULL,
email TEXTUNIQUENOTNULL,
major TEXTDEFAULT'Undeclared',
enrollment_year INT,CONSTRAINT year_check CHECK(enrollment_year >=1900),CHECK(major IN('Undeclared','Computer Science','Mathematics','Biology','Physics','Chemistry','Biochemistry')));Tecnologia
Adicionamos algumas restrições neste exemplo final. Uma universidade tem um conjunto conhecido de departamentos e cursos. Portanto, o conjunto de valores que as colunas major e department podem ter é finito e conhecido antecipadamente. Nessas situações, recomenda-se o uso de uma restrição CHECK para garantir que as colunas só possam receber valores desse conjunto conhecido de valores.
Conclusão
Neste artigo, exploramos os diferentes tipos de restrições de integridade no SQL e como implementá-las usando o PostgreSQL. Abordamos chaves primárias, restrições NOT NULL, restrições UNIQUE, restrições DEFAULT, restrições CHECK e restrições FOREIGN KEY, fornecendo exemplos práticos para cada uma delas.
Ao compreender esses conceitos, podemos garantir a precisão, a consistência e a confiabilidade de nossos dados.
Se você quiser saber mais sobre como organizar os dados de forma eficiente, confira este curso sobre Design de banco de dados.
Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Saiba como usar os acionadores SQL para automatizar tarefas, manter a integridade dos dados e melhorar o desempenho do banco de dados. Experimente exemplos práticos como os comandos CREATE, ALTER e DROP no MySQL e no Oracle.
Imagine um banco de dados hospitalar em que as alergias dos pacientes não podem ser deixadas em branco ou um sistema financeiro em que os valores das transações devem ser números positivos. Nesses cenários e em inúmeros outros, contamos com restrições de integridade para garantir que nossos dados permaneçam precisos, consistentes e confiáveis.
Em SQL, as restrições de integridade são regras que impomos às tabelas de nosso banco de dados para manter a qualidade dos dados. Eles ajudam a evitar erros, aplicam regras comerciais e garantem que nossos dados reflitam as entidades e os relacionamentos do mundo real que eles representam.
Neste artigo, vamos nos aprofundar nos tipos essenciais de restrições de integridade em SQL, fornecendo explicações claras e exemplos práticos para ilustrar seu uso em um banco de dados PostgreSQL. Embora usemos a sintaxe do PostgreSQL, os conceitos são facilmente traduzidos para outros dialetos SQL.
Se você quiser saber mais sobre SQL, confira esta lista de cursos de SQL.
O que são restrições de integridade no SQL?
Considere um cenário em que temos uma tabela que armazena informações do usuário para um aplicativo da Web. Alguns dados, como a idade do usuário, podem ser opcionais porque não impedem que os usuários acessem nosso aplicativo. No entanto, ter uma senha para cada usuário é essencial para fins de login. Para resolver isso, implementaríamos uma restrição de integridade na coluna de senha da tabela do nosso usuário para garantir que cada entrada nessa tabela inclua uma senha.
Em essência, as restrições de integridade são cruciais para:
Neste artigo, exploraremos as seguintes restrições de integridade essenciais no SQL:
PRIMARY KEY: Identifica de forma exclusiva cada registro em uma tabela.NOT NULL: Garante que uma coluna não possa conter valores NULL.UNIQUE: Garante que todos os valores em uma coluna ou grupo de colunas sejam exclusivos.DEFAULT: Fornece um valor padrão para uma coluna quando nenhum é especificado.CHECK: Garante que todos os valores em uma coluna satisfaçam uma condição específica.FOREIGN KEY: Estabelece relações entre tabelas ao fazer referência a uma chave primária em outra tabela.Caso de estudo: Banco de dados da universidade
Vamos considerar um banco de dados relacional para uma universidade. Esse banco de dados contém três tabelas:
students,courses, eenrollments.Tabela de alunos
A tabela
studentscontém informações sobre todos os estudantes universitários.student_id: O identificador do alunofirst_name: O primeiro nome do aluno.last_name: O sobrenome do aluno.email: O endereço de e-mail do aluno.major: O curso do aluno.enrollment_year: O ano em que o aluno se matriculou.Tabela de cursos
Na tabela
coursesvocê encontra informações sobre os cursos disponíveis na universidade.course_id: O identificador do curso.course_name: O nome do curso.department: O departamento do curso.Tabela de registros
A tabela
enrollmentsarmazena informações sobre quais alunos estão matriculados em quais cursos.student_id: O identificador do aluno matriculado no curso.course_id: O identificador do curso.year: O ano da matrícula.grade: A nota do aluno nesse curso.is_passing_grade: Um booleano que indica se a nota está sendo aprovada.Ao longo deste artigo, usaremos esse banco de dados de exemplo e mostraremos várias maneiras de impor a integridade dos dados. Usaremos a sintaxe do PostgreSQL em nossas consultas. No entanto, os conceitos são facilmente traduzidos para outros tipos de SQL.
Restrição PRIMARY KEY
O objetivo da universidade é identificar cada aluno de forma exclusiva. Não é aconselhável utilizar o nome e o sobrenome para essa finalidade devido à possibilidade de duplicação de nomes entre os alunos. Da mesma forma, confiar em endereços de e-mail não é o ideal, pois os alunos podem mudar seus e-mails.
A solução comum para garantir a identificação exclusiva é atribuir um identificador exclusivo a cada aluno, que é armazenado na coluna
student_id. Podemos aplicar uma restriçãoPRIMARY KEYà colunastudent_idpara garantir que cada aluno tenha um identificador exclusivo.Essa restrição é definida no comando
CREATE TABLE, após a especificação do tipo de dados da coluna:A consulta acima cria a tabela de alunos com as seis colunas que mencionamos acima.
A restrição
PRIMARY KEYgarante que você não terá problemas:student_id.student_idé único.Restrição PRIMARY KEY em várias colunas
Em determinados cenários, precisamos utilizar várias colunas para identificar cada linha de forma exclusiva. Veja, por exemplo, a tabela
enrollments. Um aluno pode se inscrever em vários cursos, o que resulta em várias linhas que compartilham o mesmostudent_id. Da mesma forma, um curso pode ter vários alunos inscritos, o que resulta em várias linhas com o mesmocourse_id.Como nenhum campo individual pode identificar exclusivamente uma linha, cada registro de inscrição é determinado usando uma combinação de
student_id,course_ideyear.Quando várias colunas estão envolvidas, a restrição
PRIMARY KEYé especificada no final do comandoCREATE TABLE.Restrições de integridade após a criação da tabela
Há duas maneiras de adicionar restrições de integridade. Acabamos de aprender como fazer isso quando a tabela é criada.
Imagine que a tabela já existe, mas você esqueceu de especificar a restrição
PRIMARY KEY. Você também pode defini-lo depois que a tabela for criada usando o comandoALTER TABLE, da seguinte forma:Na consulta
ALTER TABLE, chamamos a restrição deenroll_pk(que significa chave primária de registro). Esse nome pode ser qualquer identificador que você escolher, mas é recomendável selecionar um nome que transmita de forma sucinta o objetivo da restrição.É uma prática recomendada nomear as restrições de integridade, pois isso proporciona vários benefícios:
Restrição NOT NULL
A universidade quer garantir que o nome e o e-mail de cada aluno sejam registrados no banco de dados. Eles não querem que a equipe se esqueça de inserir qualquer um desses campos acidentalmente.
Para superar isso, podemos usar as restrições
NOT NULLnessas três colunas ao criar a tabela:A consulta acima usa as restrições
NOT NULLpara garantir que as colunasfirst_name,last_nameeemailnão possam ter valoresNULL(indefinidos).Você pode adicionar uma restrição
NOT NULLa uma tabela existente usando o comandoALTER TABLE. A sintaxe para adicionar as restrições do siteNOT NULLé a seguinte:Restrição UNIQUE
Os endereços de e-mail são inerentemente exclusivos para cada indivíduo. Em situações em que temos certeza de que um campo nunca deve ter valores duplicados, é uma boa prática impor isso em um nível de banco de dados. Isso ajuda a evitar erros e a garantir a integridade dos dados.
A adição dessa restrição é feita da mesma forma que as outras.
No entanto, em nosso caso, também queremos impor a restrição
NOT NULL. Podemos impor várias restrições em uma única coluna separando-as por espaço:Observe que a ordem não importa, pois também poderíamos ter usado
NOT NULL UNIQUE.Para adicionar uma restrição
UNIQUEa uma tabela existente, você deve fazer o seguinte:Restrição UNIQUE em várias colunas
Suponhamos que você queira garantir que o nome do curso de cada departamento seja exclusivo na tabela
courses. Nesse caso, as colunascourse_nameedepartmentjuntas devem ser exclusivas.Quando várias colunas estão envolvidas, a restrição é adicionada ao final do comando
CREATE TABLE:Como alternativa, podemos adicionar a restrição alterando uma tabela existente. Nesse caso, fornecemos uma tupla com os nomes das colunas:
Restrições NOT NULL UNIQUE vs. PRIMARY KEY
Aprendemos que a restrição
PRIMARY KEYimpõe a unicidade e que não há valores ausentes. Então você deve estar se perguntando qual é a diferença entre:A diferença entre
NOT NULL UNIQUEePRIMARY KEYem uma tabela é a finalidade e o uso pretendidos.Embora ambos imponham a exclusividade e a não nulidade em uma ou mais colunas, uma tabela só pode ter um
PRIMARY KEY, que se destina a identificar exclusivamente cada registro na tabela.Por outro lado, a restrição de combinação
NOT NULL UNIQUEpode ser aplicada a colunas adicionais para impor um valor exclusivo em cada linha, sem valores nulos, servindo para manter a integridade dos dados para regras comerciais específicas. Uma tabela pode ter qualquer número de restriçõesNOT NULL UNIQUE.A existência de ambos permite maior flexibilidade no design do banco de dados, possibilitando várias maneiras de impor a exclusividade e a integridade dos dados e, ao mesmo tempo, distinguir entre o identificador primário de um registro e outros atributos importantes e exclusivos de uma tabela.
Restrição DEFAULT
Os alunos podem precisar de algum tempo após a matrícula na universidade para selecionar sua área de especialização. A universidade gostaria que o valor da coluna major fosse a string "Undeclared" (não declarado) para os alunos que ainda não selecionaram sua especialização.
Para isso, podemos definir um valor padrão para essa coluna usando a restrição
DEFAULT. Você pode alterar a tabela de alunos da seguinte forma:Se, em vez disso, quisermos definir uma restrição
DEFAULTquando a tabela for criada, você poderá fazer isso declarando-a após o tipo de dados da coluna:Restrição CHECK
Nessa universidade em particular, as notas vão de 0 a 100. Sem nenhuma restrição, a coluna
gradeda tabelaenrollmentaceita qualquer valor inteiro. Podemos corrigir isso usando uma restriçãoCHECKpara impor que os valores estejam entre 0 e 100.Em geral, as restrições do
CHECKnos permitem validar condições específicas que queremos que os dados satisfaçam. Isso é importante para garantir a consistência e a integridade dos dados.Uma restrição
CHECKpode envolver mais de uma coluna. Vamos usá-lo para garantir quegradeeis_passing_gradetenham valores consistentes. Digamos que uma nota seja aprovada se seu valor for de pelo menos 60. Então, podemos garantir queis_passing_gradeéTRUEse e somente se a nota for de pelo menos 60. Vamos fazer isso na criação da tabela para mostrar como as restriçõesCHECKsão declaradas no comandoCREATE TABLE:Há um problema com a restrição acima. Quando um aluno se matricula em um curso, ele ainda não tem uma nota. Portanto, devemos permitir valores de
NULLna nota. Ao fazer isso, também precisamos atualizar a restrição de nota de aprovação para que sejaNULLquando a nota ainda estiver indefinida. Veja como você pode atualizar a restrição para levar isso em consideração:Observe que, nas colunas
gradeeis_passing_grade, adicionamosNULLno tipo de dados e como valor padrão. O objetivo deles é simplesmente aumentar a legibilidade.Vamos ver agora quais condições podemos impor com uma restrição
CHECK.Condições de alcance
Podemos garantir que os valores em uma coluna estejam dentro de um intervalo específico.
Listar condições
Podemos validar se o valor de uma coluna corresponde a um valor em uma lista de valores específicos.
Condições de comparação
Podemos comparar valores em uma coluna para garantir que eles atendam a uma condição específica (maior que, menor que etc.).
Condições de correspondência de padrões
Podemos usar a correspondência de padrões (por exemplo, com
LIKEouSIMILAR TO) para validar dados de texto.Condições lógicas
Você pode permitir várias condições usando operadores lógicos (
AND,OR,NOT).Condições compostas
Aplica uma condição em várias colunas.
Restrição FOREIGN KEY
As restrições de chave estrangeira são usadas para vincular as colunas de duas tabelas, garantindo a integridade referencial dos dados. Em essência, uma chave estrangeira em uma tabela aponta para uma chave primária em outra tabela, indicando que as linhas nessas duas tabelas estão relacionadas. Isso garante que você não possa ter uma linha em uma tabela com uma chave estrangeira que não corresponda a nenhuma linha na tabela vinculada com a chave primária.
Em nosso exemplo, cada registro na tabela de matrículas refere-se a um aluno e a um curso por meio das colunas
student_idecourse_id, respectivamente. Sem nenhuma restrição, não há nada que garanta que os valores desses identificadores na tabela de matrículas correspondam às entradas existentes nas tabelas de alunos e cursos.Veja como garantimos isso quando criamos a tabela
enrollments:Observe que, para que sejam chaves estrangeiras, elas devem ser chaves primárias nas tabelas
studentsecourses, respectivamente.Assim como com outras restrições, também podemos declará-las após a criação da tabela usando o comando
ALTER TABLE:Colocando tudo junto
Ao longo deste artigo, apresentamos várias restrições de integridade e como usá-las para aprimorar um banco de dados universitário. Aqui está a versão final do comando
CREATE TABLE, que combina tudo o que aprendemos.Primeiro, definiremos a tabela
students:A seguir, vamos definir a tabela
courses:Por fim, definiremos a tabela
enrollments, estabelecendo as relações entre alunos e cursos:Adicionamos algumas restrições neste exemplo final. Uma universidade tem um conjunto conhecido de departamentos e cursos. Portanto, o conjunto de valores que as colunas
majoredepartmentpodem ter é finito e conhecido antecipadamente. Nessas situações, recomenda-se o uso de uma restriçãoCHECKpara garantir que as colunas só possam receber valores desse conjunto conhecido de valores.Conclusão
Neste artigo, exploramos os diferentes tipos de restrições de integridade no SQL e como implementá-las usando o PostgreSQL. Abordamos chaves primárias, restrições
NOT NULL, restriçõesUNIQUE, restriçõesDEFAULT, restriçõesCHECKe restriçõesFOREIGN KEY, fornecendo exemplos práticos para cada uma delas.Ao compreender esses conceitos, podemos garantir a precisão, a consistência e a confiabilidade de nossos dados.
Se você quiser saber mais sobre como organizar os dados de forma eficiente, confira este curso sobre Design de banco de dados.