SQL DDL Criando Tabelas e Restrições Instituto Militar de Engenharia IME Material extraido parcialmente de notas de aula de Maria Luiza Campos e Arnaldo Vieira Comandos de Definição de Dados Aplicação de BD Aplicação de BD SGBD BD BD BD schema domain table view index assertion database 1
Create Schema Coleção de tabelas, visões, domínios, funções e permissões CREATE SCHEMA [schema_name] [AUTHORIZATION owner_name] [DEFAULT CHARACTER SET char_set_name] [PATH schema_name [, ]] [ANSI CREATE statements [ ]] [ANSI GRANT statements [ ]] Ex. CREATE SCHEMA empresa AUTHORIZATION a01 CREATE TABLE empregado ( ) CREATE TABLE departamento ( ) Create Table EMPREGADO Nome SNome Matrícula DataNasc Endereço Sexo Salário SuperMat Depto DEPARTAMENTO DeptoNome DeptoSigla MatrículaGerente DEPTO_LOCAL Depto Localização PROJETO PNome PCódigo PLocalização Depto TRABALHA_EM MatrículaEmp PCódigo Horas DEPENDENTE MatrículaEmp DependenteNome Sexo DataNasc Parentesco 2
Create Table Para criar as tabelas CREATE [{LOCAL TEMPORARY GLOBAL TEMPORARY}] TABLE table_name (column_name datatype attributes [, ]) [CONSTRAINT constraint_type [constraint_name] [, ]] Attributes podem ser NOT NULL DEFAULT CONSTRAINT Tipos de dados char(n) varchar(n) ou char varying(n) int ou integer shortint float ou real double precision decimal(n,d) ou numeric(n,d) date Time Blob Clob Boolean SQL:2003 BIGINT, MULTISET, XML 3
Create Table create table Empregado ( Nome varchar(15) not null, SNome varchar(15) not null, Matrícula char(9) not null, DataNasc date, Endereço varchar(30), Sexo char, Salário decimal(10,2), SuperMat char(9), Depto char(5) not null, primary key (Matrícula), foreign key (SuperMat) references Empregado(Matrícula), foreign key (Depto) references Departamento (DeptoSigla)); Create Table create table Departamento ( DeptoNome varchar(15) not null, DeptoSigla char(5) not null, MatrículaGerentechar(9) not null, primary key (DeptoSigla), unique (DeptoNome), foreign key (MatrículaGerente) references Empregado (Matrícula)); Atributos UNIQUE: Podem ser referenciados? Como fica a integridade referencial? Podem ser anuláveis? Sim mas só permitem um nulo (MSSQL server) Mas e se o atributo que o referencia puder ser nulo? Estaria referenciando esta tupla? 4
Create Table create table Depto_Local ( Depto char(9) not null, Localização varchar(15) not null, primary key (Depto, Localização), foreign key (Depto) references Departamento (DeptoSigla)); Notem a primary key composta! Create Table create table Projeto ( PNome varchar(15) not null, Pcódigo int not null, PLocalização varchar(15), Depto char(5) not null, primary key (Pcódigo), unique (PNome), foreign key (Depto) references Departamento (DeptoSigla)); create table Trabalha_Em ( MatrículaEmp char(9) not null, Pcódigo int not null, Horas decimal(3,1) not null, primary key (MatrículaEmp, Pcódigo), foreign key (MatrículaEmp) references Empregado (Matrícula), foreign key (Pcódigo ) references Projeto (Pcódigo)); 5
Create Table create table Dependente ( MatrículaEmp char(9) not null, DependenteNome varchar(15) not null, Sexo char, DataNasc date, Parentesco varchar(8) not null, AuxilioCreche numeric(6,2), primary key (MatrículaEmp, DependenteNome), foreign key (MatrículaEmp) references Empregado (Matrícula)); Alter Table Acrescentar e remover atributos Ex. ALTER TABLE Dependente ADD Parentesco VARCHAR(8) DEFAULT `filho`; ALTER TABLE Dependente DROP AuxilioCreche; Alguns SGBDs oferecem MODIFY Ex. ALTER TABLE Dependente MODIFY Parentesco VARCHAR(8) DEFAULT `filho`; 6
Geradores de Sequência Padronizado no SQL 2003 Para preencher valores de chaves Controle fica centralizado em um objeto O uso de chaves (naturais) como cpf ou e-mail pode trazer problemas CREATE SEQUENCE PARTSEQ AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 10000 NO CYCLE Usando/Modificando Geradores de Sequência Função built-in: NEXT VALUE FOR chamada no momento da inclusão INSERT INTO SHIPMENT ( PARTNUM, DECRIPTION, QUANTITY ) VALUES ( NEXT VALUE FOR PARTSEQ, 'Display', 20); 7
IDENTITY Declarar tipos sequenciais na própria estrutura da tabela Função next value for fica implícita na inserção. GENERATED ALWAYS ou BY DEFAULT.. CREATE TABLE PARTS ( PARTNUM INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 10000 NO CYCLE), DESCRIPTION VARCHAR (100), QUANTITY INTEGER INSERT INTO PARTS (DESCRIPTION, QUANTITY) VALUES ('WIDGET', 30) Restrições Domínio Chaves primárias e secundárias Chaves estrangeiras Check Assertion 8
Domínios apenas permite que um tipo de dados seja compartilhado por vários atributos. create domain Cor char (6) default??? constraint CoresValidas check ( value in ( azul, amarelo, verde,??? )) ;... create table T (..., cort Cor,... ) ; Restrições create table Empregado (... Depto char(5) not null default DESC, constraint Emppk primary key (Matrícula), constraint Superfk foreign key (SuperMat) references Empregado(Matrícula) on delete set null on update cascade, constraint EmpDept foreign key (Depto) references Departamento (DeptoSigla) on delete set null on update cascade ); 9
Restrições create table Departamento (... MatrículaGerente char(9) not null default 888665555, constraint Deptopk primary key (DeptoSigla), constraint Deptosk unique (DeptoNome), constraint DeptoGerfk foreign key (MatriculaGerente) references Empregado (Matrícula) on delete set default on update cascade ); create table Depto_Local (... primary key (Depto, Localização), foreign key (Depto) references Departamento (DeptoSigla) on delete cascade on update cascade ); Restrições check (expressão) create table SP ( S# char(5) not null, P# char(5) not null, Qtde integer not null, primary key (S#, P#), foreign key (S#) references S (S#) on delete cascade on update cascade, Pode-se envolver mais de uma coluna foreign key (P#) references P (P#) on delete cascade on update cascade, check (Qtde > 0 and Qtde < 5001) ); 10
Restrições check (expressão) com mais de uma coluna create table Pessoa ( id integer not null, nome char(50) not null, idade integer not null check (idade between 0 and 120), tempo_serv integer not null,, check (idade > tempo_serv + 18) ); Restrições check pode ser usado ao invés de create domain create table P ( P# char(5) not null, CorP char(10) not null, primary key (P#), check (CorP in (`azul`, `verde`, `branco`)) ); not null pode ser declarado como um check check (CorP is not null) 11
Restrições Cuidado com checks que envolvem mais de uma tabela! create table EMPREGADO ( matricula char(9) not null, nome varchar(20) not null, depto char(5) check (depto in (select deptosigla from DEPARTAMENTO)),... Inclusões e atualizações em EMPREGADO são verificadas, mas remoções em DEPARTAMENTO não o serão Assertions General constraints Quando a restrição envolve mais de uma relação e precisa ser verificada sempre que qq das relações envolvidas mudar Ex. CREATE ASSERTION marajá CHECK (NOT EXISTS ( SELECT * FROM empregado e, trabalha_em t WHERE e.matricula = t.matriculaemp AND e.salario > 100000)) 12
Modificando Restrições Atribuir nomes às restrições Add/drop restrições Exemplos: ALTER TABLE empregado DROP CONSTRAINT Deptosk ALTER TABLE empregado ADD CONSTRAINT nova CHECK sexo IN ( F, M ) ALTER DOMAIN Cor DROP CONSTRAINT CoresValidas ALTER DOMAIN Cor ADD CONSTRAINT CoresModa CHECK (values IN ( rosa,...)) DROP ASSERTION marajá 13