Escolar Documentos
Profissional Documentos
Cultura Documentos
USER
CREATE TABLE USER
( Login
Login PRIMARY KEY VARCHAR(16), Joined
Joined DATE NOT NULL, Name
Name VARCHAR(128) NOT NULL, BirthDate
BirthDate DATE NOT NULL,
Sex
Sex ENUM('M', 'F') NOT NULL,
Phone ?
Phone INT DEFAULT NULL,
Email VARCHAR(64) NOT NULL Email
);
Chave primária: Login.
Tabela não tem chaves externas.
Atributos não-opcionais indicados com NOT NULL (todos excepto EMAIL).
NOT NULL não precisa de ser especificado para uma chave primária (não
são admitidos valores NULL).
Bases de Dados Introdução a SQL 7
Tipos principais para campos (MySQL)
TINYINT (1 byte), SMALLINT (2)
Números
MEDIUMINT (3), INT (4),
Inteiros
BIGINT (8)
Números
DECIMAL, NUMERIC,
de vírgula
FLOAT, DOUBLE
flutuante
Sequências CHAR, VARCHAR, ENUM,
de caracteres TEXT / MEDIUMTEXT /LONGTEXT
DATE, DATETIME, TIME, TIMESTAMP,
Tempo
YEAR
);
Chave primária: Num
Chave secundária (por via de UNIQUE): Login
POST_LIKED USER
POST User Num
Num Post …
…
USE SOCIAL_NETWORK;
Para uma BD já criada empregamos a instrução USE para indicar qual a BD
activa para execução de comandos.
FLOAT
Números reais representáveis em 32 bits com precisão
arbitrária
DOUBLE
Números reais representáveis em 64 bits com precisão
arbitrária
DECIMAL(D, P)
Números reais representáveis na escala de D dígitos decimais
com precisão de P dígitos
Exemplo — valores correspondentes a DECIMAL(3,2) podem
ser: 100.23 -2.35 2.1 -999.99
… mas não 1234 1.234 -1234.567
CHAR(N)
Sequência de caracteres de tamanho fixo N, onde N <= 255 (28-1).
Para um valor de tamanho L <= N , a BD armazena sempre N
caracteres usando o caracter para “padding” à direita.
VARCHAR(N)
Sequência de caracteres de tamanho variável até N caracteres,
onde N <= 65535 (216 - 1). Para um valor de tamanho L <= N , a BD só
armazena L caracteres.
ENUM(‘VALOR 1’, …, ‘VALOR N’)
Tipo enumerado (como exemplificado para USER.Sex)
TEXT / MEDIUMTEXT / LONGTEXT
Texto de comprimento variável até 64 KB / 16 MB / 4GB
Bases de Dados Introdução a SQL 18
Tipos de dados temporais
YEAR
Ano
DATE
Representação de datas com a forma YYYY-MM-DD
TIME
Representação de horas com a forma [H]HH:MM:SS
DATETIME, TIMESTAMP
Representação de data e hora.
Valores com a forma YYYY-MM-DD [H]HH:MM:SS[.dddddd]
6 dígitos de precisão (até micro-segundos)
TIMESTAMP guardado na BD com conversão para “UTC
time”
Bases de Dados Introdução a SQL 19
Manipulação de registos
INSERT
Inserção de registos
SELECT
Consulta (leitura) de registos (não altera BD)
UPDATE
Actualização de registos já existentes
DELETE
Remoção de registos
DELETE FROM
<NOME DA TABELA>
WHERE
<CONDIÇÃO>;
NOW()
Devolve a data e tempo actual (DATETIME)
YEAR(x) MONTH(x) DAY(x)
Devolvem o ano, mês, ou dia de um valor DATE ou DATETIME
HOUR(x) MINUTE(x), SECOND(x)
Análogo para horas, minutos e segundos para um valor
DATETIME ou TIME
TIMESTAMPDIFF(ESCALA, A, B)
Calcula diferença entre B e A em determinada escala
(ESCALA=YEAR|MONTH|DAY|HOUR| MINUTE|SECOND|…)
SELECT …
FROM …
[WHERE …]
[ORDER BY ….]
LIMIT n;
POST
/* User 1 exists and is the author of some posts */
DELETE FROM USER WHERE Num = 1; Num USER
Author Num
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign
key constraint fails (`guest`.`post`, CONSTRAINT `post_ibfk_1` Creation …
FOREIGN KEY (`Author`) REFERENCES `USER` (`Num`)) Content
…
FOREIGN KEY(Post) REFERENCES POST(Num) ON DELETE CASCADE,
FOREIGN KEY(Author) REFERENCES USER(Num) ON DELETE CASCADE
);
… Num USER
Problema geral:
O esquema de uma BD tem normalmente necessidade de mudar
ao longo do tempo.
Por exemplo a nossa “imitação” de rede social poderia “crescer”
por forma a termos grupos de utilizadores, tipos de “like”,
definições de privacidade, etc.
Mudanças ao esquema: não devem levar à perda de dados
existentes (a não ser que esse seja o objectivo) ou a perda sua
consistência, e idealmente (embora nem sempre possível) sem
tornar indisponível o acesso a utilizadores.
Este problema é complexo. Neste contexto damos apenas
uma ideia de algumas alterações/evoluções simples de um
esquemas usando o comando ALTER TABLE.
— Dados não foram perdidos, além dos de email (o que era pretendido).
— “Rede social” permite agora a definição do país dos utilizadores quando
desejável (NULL por omissão; subentende-se que não vamos assumir a
nacionalidade dos utilizadores já existentes.).
— Nomes de utilizadores passam a poder ter 256 caracteres.
ERROR 1829 (HY000): Cannot drop column 'Num': needed in a foreign key
constraint 'comment_ibfk_2' of table 'guest.comment'
Bases de Dados Introdução a SQL 62