Aula 10 a 11 - Rodando primeiro comando / Usuários
Podemos consultar os bancos de dados disponíveis na
instancia do MySQL com o comando
show databases.
Podemos criar usuários no ambiente gráfico do MySQL através da opção Administration -> Management -> Users and Privileges - Add Account.
Nessa opção podemos criar o usuário e definir em Administrative Roles as opções de acesso do usuário.
Podemos manipular as permissões de usuários através da linha de comando (o exemplo abaixo não funcionou para minha configuração).
grant all privileges on *.* to exemplo@ identified by 'exemplo' with grant option;
ou;
revoke all privileges on *.* from example@localhost;

Podemos criar usuários no ambiente gráfico do MySQL através da opção Administration -> Management -> Users and Privileges - Add Account.
Nessa opção podemos criar o usuário e definir em Administrative Roles as opções de acesso do usuário.
Podemos manipular as permissões de usuários através da linha de comando (o exemplo abaixo não funcionou para minha configuração).
grant all privileges on *.* to exemplo@ identified by 'exemplo' with grant option;
ou;
revoke all privileges on *.* from example@localhost;
Aula 12 a 14 - Criando schema / Criando tabela / Unique
Podemos criar um schema que é um novo Banco de
Dados através da opção no Workbench ou com o
comando:
CREATE SCHEMA nome_do_schema;
ou:
CREATE DATABASE nome_do_schema;
Para apagar um Banco de Dados utilizamos o comando:
DROP SCHEMA(DATABASE) nome_do_schema.
Criado o Database podemos criar as tabelas que é a estrutura para as coleções de dados. Para isso no Workbench basta selecionar a opção Tables dentro do Schema criado. Ao criar uma tabela definimos os campos de acordo com os tipos de dados que iremos utilizar. Um campo de identificação deve ser criado para a Primary Key (chave primária) do banco de dados. Esse campo deve conter valores únicos. Em seguida definimos os demais campos e seu Datatype. Entre as opções que podemos utilizar nos campos temos a Not null (NN) que indica que o camppo é de preenchimento obrigatório. Abaixo uma pequena estrutura para a criação de uma tabela:
O comando para alterar uma tabela e incluir por exemplo a propriedade Unique é o seguinte:

CREATE SCHEMA nome_do_schema;
ou:
CREATE DATABASE nome_do_schema;
Para apagar um Banco de Dados utilizamos o comando:
DROP SCHEMA(DATABASE) nome_do_schema.
Criado o Database podemos criar as tabelas que é a estrutura para as coleções de dados. Para isso no Workbench basta selecionar a opção Tables dentro do Schema criado. Ao criar uma tabela definimos os campos de acordo com os tipos de dados que iremos utilizar. Um campo de identificação deve ser criado para a Primary Key (chave primária) do banco de dados. Esse campo deve conter valores únicos. Em seguida definimos os demais campos e seu Datatype. Entre as opções que podemos utilizar nos campos temos a Not null (NN) que indica que o camppo é de preenchimento obrigatório. Abaixo uma pequena estrutura para a criação de uma tabela:
CREATE TABLE `curso_mysql`.`clientes` (
`id` INT NOT NULL,
`nome` VARCHAR(45) NOT NULL,
`email` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `curso_mysql`.`produtos` (
`id` INT NOT NULL,
`nome` VARCHAR(100) NOT NULL,
`preco` DOUBLE NOT NULL,
PRIMARY KEY (`id`));
Outra opção para as colunas nas tabelas é a
Unique(UQ) que indica que aquele campo não pode
ter valores repetidos. Essa opção é semelhante a
Primary Key entretanto a segunda além de não
poder ser repetida serve também para indexar os dados na
coleção ao passo que a primeira apenas não permite a
repetição de dados.`id` INT NOT NULL,
`nome` VARCHAR(45) NOT NULL,
`email` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `curso_mysql`.`produtos` (
`id` INT NOT NULL,
`nome` VARCHAR(100) NOT NULL,
`preco` DOUBLE NOT NULL,
PRIMARY KEY (`id`));
O comando para alterar uma tabela e incluir por exemplo a propriedade Unique é o seguinte:
ALTER TABLE `curso_mysql`.`clientes`
ADD UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE;
ADD UNIQUE INDEX `email_UNIQUE` (`email` ASC) VISIBLE;
Aula 15 - chave estrangeira
Existem no SQL dois tipos de chaves. A
Primary Key e a Foreign Key. A
Foreign Key é um campo em uma tabela que recebe
a referencia de uma Primary Key de outra tabela
fazendo uma conexão entre os dados das duas.
Podemos criar uma tabela com um relacionamento por Foreign Key conforme o exemplo abaixo:

Podemos criar uma tabela com um relacionamento por Foreign Key conforme o exemplo abaixo:
CREATE TABLE `curso_mysql`.`pedidos` (
`id` INT NOT NULL,
`produto_id` INT,
`quantidade` INT,
PRIMARY KEY(`id`),
FOREIGN KEY (produto_id) REFERENCES produtos(id));
`id` INT NOT NULL,
`produto_id` INT,
`quantidade` INT,
PRIMARY KEY(`id`),
FOREIGN KEY (produto_id) REFERENCES produtos(id));
Aula 16 a 19 - Adicionando colunas / Removendo colunas
/ Adicionando constraints / Setando e removendo valor
padrão
Podemos fazer alterações na tabela como inclusão de
colunas. Para isso podemos utilizar o comando
ALTER TABLE como a seguir:
ALTER TABLE `curso_mysql`.`pedidos` ADD COLUMN total
DOUBLE;
Para remover uma coluna da mesma forma utilizamos a seguinte sintaxe: ALTER TABLE `curso_mysql`.`pedidos` DROP COLUMN total; Para modificar as restrições de uma coluna podemos utilizar o comando CONSTRAINT:
Podemos definir valores padrão para colunas do formulário, para caso o campo não seja preenchido. Para isso utilizamos o comando SET DEFAULT:

Para remover uma coluna da mesma forma utilizamos a seguinte sintaxe: ALTER TABLE `curso_mysql`.`pedidos` DROP COLUMN total; Para modificar as restrições de uma coluna podemos utilizar o comando CONSTRAINT:
ALTER TABLE `curso_mysql`.`clientes` ADD COLUMN
cpf VARCHAR(20);
Adicionamos uma coluna para CPF e em seguida
transformamos ela para UNIQUE:
ALTER TABLE `curso_mysql`.`clientes` ADD CONSTRAINT cpf_unico UNIQUE(cpf);
Podemos alterar os parametros de uma coluna com o
comando MODIFY:
ALTER TABLE `curso_mysql`.`clientes` ADD CONSTRAINT cpf_unico UNIQUE(cpf);
ALTER TABLE `curso_mysql`.`clientes` MODIFY cpf
VARCHAR(14) NOT NULL;
Para remover uma restrição do tipo UNIQUE de
uma coluna utilizamos o DROP no indice criado
para a propriedade:
ALTER TABLE `curso_mysql`.`clientes` DROP INDEX
cpf_unico;
Note que tanto na criação quanto na remoção da
restrição UNIQUE criamos um novo nome para
a coluna (cpf_unico, email_UNIQUE). Esse valor na
verdade é a chave que será verificada para garantir
que o valor seja único e pode ser vista no
Workbench na aba indexes
Podemos definir valores padrão para colunas do formulário, para caso o campo não seja preenchido. Para isso utilizamos o comando SET DEFAULT:
ALTER TABLE `curso_mysql`.`pedidos` ALTER COLUMN
total SET DEFAULT 0;
Onde o valor '0' é o valor que queremos como
default. Para remover essa configuração
utilizamos:
ALTER TABLE `curso_mysql`.`pedidos` ALTER COLUMN total DROP DEFAULT;
ALTER TABLE `curso_mysql`.`pedidos` ALTER COLUMN total DROP DEFAULT;
Aula 20 a 22 - Inserindo registros / Alterando
registros / Removendo registros
Um dos modos de inserir registros em um Banco de Dados é
com o comando INSERT INTO seguindo a estrutura
das colunas que se deseja incluir:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
Ou seja, caso o campo cpf não seja do tipo UNIQUE nem PRIMARY KEY há uma proteção para seleções acidentais. No caso o meu campo não estava configurado para UNIQUE.
Para remover registros utilizamos o comando DELETE:

INSERT INTO `curso_mysql`.`clientes` (id, nome,
email, cpf)
VALUES (1,'Joao da Silva','[email protected]','333.333.333-00'); Para visualizar os dados incluidos utilizamos o comando:
SELECT * FROM `curso_mysql`.`clientes`; Podemos passar os valores sem declarar as colunas caso saibamos a ordem das mesmas:
INSERT INTO `curso_mysql`.`clientes` VALUE (2, 'Mario', '[email protected]','222.222.222-22');
Para alterar registros utilizamos o comando
UPDATE. Entretanto devemos tomar alguns
cuidados pois se utilizarmos o update sem definir
qual registro deve ser atualizado alteramos todos os
registros do banco de dados. Para isso devemos definir
com o comando WHERE qual a chave ou a condição
em que devemos fazer a alteração: VALUES (1,'Joao da Silva','[email protected]','333.333.333-00'); Para visualizar os dados incluidos utilizamos o comando:
SELECT * FROM `curso_mysql`.`clientes`; Podemos passar os valores sem declarar as colunas caso saibamos a ordem das mesmas:
INSERT INTO `curso_mysql`.`clientes` VALUE (2, 'Mario', '[email protected]','222.222.222-22');
UPDATE `curso_mysql`.`clientes` SET nome='Mario
da Silva' WHERE id=2;
É possível alterar vários campos por vez:
UPDATE `curso_mysql`.`clientes` SET nome='Mario da Silva Jr',email='[email protected]' WHERE id=2;
Devemos ficar atentos com algumas configurações
pois ao tentar selecionar o campo cpf por
meio do WHERE tive o seguinte erro: UPDATE `curso_mysql`.`clientes` SET nome='Mario da Silva Jr',email='[email protected]' WHERE id=2;
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
Ou seja, caso o campo cpf não seja do tipo UNIQUE nem PRIMARY KEY há uma proteção para seleções acidentais. No caso o meu campo não estava configurado para UNIQUE.
Para remover registros utilizamos o comando DELETE:
DELETE FROM `curso_mysql`.`clientes` WHERE id=2;
Se não fizermos a seleção com WHERE o comando
DELETE apaga todos os registros.
Aula 23 a 25 - Iniciando com select / Alias / Distinct
O comando SELECT é um dos mais utilizados no
SQL. Com ele podemos fazer diversas consultas no BD e
recuperar dados das mais diversas formas.
Para recuperar todos os dados de uma tabela:
SELECT * FROM nome_da_tabela;
Podemos selecionar apenas algumas colunas:
SELECT nome,email FROM `curso_mysql`.`clientes`;
Podemos criar apelidos para as colunas chamados de alias para facilitar a apresentação e compreensão dos dados. Para isso basta utilizarmos o operador AS:
SELECT id AS código, nome FROM clientes;
Em seguida vamos adicionar mais uma coluna a nossa tabela de clientes:
ALTER TABLE clientes ADD COLUMN uf CHAR(2); E setamos o campo para SP nos ids 1 e 2 e RJ no id 3:
UPDATE clientes SET uf='RJ' WHERE id=3;
O comando DISTINCT complementa o SELECT e retorna apenas os resultados únicos (não faz a soma de ocorrencias):
SELECT DISTINCT uf FROM clientes;

Para recuperar todos os dados de uma tabela:
SELECT * FROM nome_da_tabela;
Podemos selecionar apenas algumas colunas:
SELECT nome,email FROM `curso_mysql`.`clientes`;
Podemos criar apelidos para as colunas chamados de alias para facilitar a apresentação e compreensão dos dados. Para isso basta utilizarmos o operador AS:
SELECT id AS código, nome FROM clientes;
Em seguida vamos adicionar mais uma coluna a nossa tabela de clientes:
ALTER TABLE clientes ADD COLUMN uf CHAR(2); E setamos o campo para SP nos ids 1 e 2 e RJ no id 3:
UPDATE clientes SET uf='RJ' WHERE id=3;
O comando DISTINCT complementa o SELECT e retorna apenas os resultados únicos (não faz a soma de ocorrencias):
SELECT DISTINCT uf FROM clientes;
Aula 26 a 28 - Order by / Where / Like
O comando ORDER BY pode ser utilizado para
ordenar o resultado da pesquisa com SELECT pela
coluna definida. Podemos selecionar a ordem
ASC(ascendente) ou DESC(descendente):
SELECT * FROM clientes ORDER BY nome DESC;
Podemos definir mais campos de ordenação separando por uma vírgula.
O WHERE é necessário nos comandos de alteração e remoção, mas também pode ser utilizado em comandos de seleção para determinar quais campos queremos filtrar. É interessante quando estamos trabalhando com SQL seprarmos os comandos de acordo com seu tipo para facilitar a visualização quando estamos criando as querrys:
SELECT * FROM clientes
WHERE uf='SP'
ORDER BY nome DESC;
Vamos inserir alguns produtos para aumentar nossas buscas::

SELECT * FROM clientes ORDER BY nome DESC;
Podemos definir mais campos de ordenação separando por uma vírgula.
O WHERE é necessário nos comandos de alteração e remoção, mas também pode ser utilizado em comandos de seleção para determinar quais campos queremos filtrar. É interessante quando estamos trabalhando com SQL seprarmos os comandos de acordo com seu tipo para facilitar a visualização quando estamos criando as querrys:
SELECT * FROM clientes
WHERE uf='SP'
ORDER BY nome DESC;
Vamos inserir alguns produtos para aumentar nossas buscas::
INSERT INTO produtos VALUES(1,'Produto 1', 100);
INSERT INTO produtos VALUES(2,'Produto 2', 150);
INSERT INTO produtos VALUES(3,'Produto 3', 90);
Podemos utilizar operadores de comparação nas pesquisas
com WHERE. Importante saber que o comando
WHERE deve ser utilizado antes do
ORDER BY. INSERT INTO produtos VALUES(2,'Produto 2', 150);
INSERT INTO produtos VALUES(3,'Produto 3', 90);
SELECT * FROM produtos
WHERE preco > 90 AND preco < 120
ORDER BY preco ASC;
Vamos inserir mais alguns produtos: WHERE preco > 90 AND preco < 120
ORDER BY preco ASC;
INSERT INTO produtos values(4, 'DELL XPTO',
1000);
INSERT INTO produtos values(5, 'DELL XPTZ', 1100);
INSERT INTO produtos values(6, 'HP XPTO', 2000);
INSERT INTO produtos values(7, 'HP XPTZ', 2100);
INSERT INTO produtos values(8, 'DELL XPTO PLUS', 2100);
O comando LIKE faz o filtro pelo valor do
conteudo do campo, podendo utilizar coringas %:
INSERT INTO produtos values(5, 'DELL XPTZ', 1100);
INSERT INTO produtos values(6, 'HP XPTO', 2000);
INSERT INTO produtos values(7, 'HP XPTZ', 2100);
INSERT INTO produtos values(8, 'DELL XPTO PLUS', 2100);
SELECT * FROM produtos
WHERE nome LIKE '%XPT%';
Esse comando, pelos meus testes, não é
case sensitive.
WHERE nome LIKE '%XPT%';
Aula 29 a 31 - Funções / Group / Join
O MySQL tem algumas funções que facilitam processos:
COUNT(): conta quantos elementos existem na seleção, podendo ser combinado com outros comandos:
SELECT MAX(preco) AS 'maior preco' FROM produtos;
Outras funções são MIN()(menor), AVG()(média) e SUM()(soma).
Os operadores de comparação utilizados no SQL são: >, <, +, -, /, =, <> ou !=, >=, <= /.
Podemos agrupar o retorno de valores de acordo com a coluna selecionada com o comando GROUP BY:
Vamos agora inserir um pedido:
INSERT INTO pedidos values(1, 1, 2, 100);
Quando relacionamos duas tabelas como no caso de pedidos e produtos precisamos recuperar os dados de modo a mostrar o retorno conjuntamente. Para isso podemos relacionar as tabelas com o WHERE:
Podemos entretanto ordenar de que modo os dados são apresentados:
Fiz o ajuste do total com o UPDATE.
UPDATE pedidos SET total=200 WHERE pedidos.id=1;

COUNT(): conta quantos elementos existem na seleção, podendo ser combinado com outros comandos:
SELECT COUNT(*) FROM produtos
WHERE nome LIKE '%XPT%';
Se utilizarmos a função MAX() podemos solicitar
o maior valor da coluna: WHERE nome LIKE '%XPT%';
SELECT MAX(preco) AS 'maior preco' FROM produtos;
Outras funções são MIN()(menor), AVG()(média) e SUM()(soma).
Os operadores de comparação utilizados no SQL são: >, <, +, -, /, =, <> ou !=, >=, <= /.
Podemos agrupar o retorno de valores de acordo com a coluna selecionada com o comando GROUP BY:
SELECT uf, COUNT(*) AS 'Quantidade de clientes'
FROM clientes
GROUP by UF;
ou
SELECT preco, count(*) AS 'maior preco' FROM produtos
GROUP BY preco;
GROUP by UF;
ou
SELECT preco, count(*) AS 'maior preco' FROM produtos
GROUP BY preco;
Vamos agora inserir um pedido:
INSERT INTO pedidos values(1, 1, 2, 100);
Quando relacionamos duas tabelas como no caso de pedidos e produtos precisamos recuperar os dados de modo a mostrar o retorno conjuntamente. Para isso podemos relacionar as tabelas com o WHERE:
SELECT *, nome FROM pedidos, produtos
WHERE pedidos.produto_id = produtos.id;
WHERE pedidos.produto_id = produtos.id;
Podemos entretanto ordenar de que modo os dados são apresentados:
SELECT pedidos.id, nome, quantidade, preco as
'valor unitario', total
FROM pedidos, produtos
WHERE pedidos.produto_id = produtos.id;
Desse modo temos os dados retornados de modo mais
organizado. FROM pedidos, produtos
WHERE pedidos.produto_id = produtos.id;
Fiz o ajuste do total com o UPDATE.
UPDATE pedidos SET total=200 WHERE pedidos.id=1;
Aula 32 a 33 - Criando primeira procedure / Criando
procedure de pedidos
Aqui temos algumas diferenças entre versão que estou
utilizando e a versão da aula.
Na versão da aula o BD tem tres itens: Tables, Views e Routines. Na versão que estou utilizando a opção Routines é substituida por Stored Procedures e Functions.
Na versão da aula executou-se o comando
SELECT * FROM INFORMATION_SCHEMA.ROUTINES;
para apresentar as rotinas criadas. Na minha versão o retorno desse comando apresenta, aparentemente, algumas funções nativas do MySQL.
Podemos substituir o delimitador de expressões (por padrão é o ';') utilizando o commando DELIMITER:
DELIMITER &&
SELECT * FROM INFORMATION_SCHEMA.ROUTINES&&
Isso é util para a criação de procedures.
Em seguida criamos uma procedure:
Para executar uma procedure utilizamos o comando CALL nome_da_procedure:
CALL PRIMEIRA();
Agora vamos criar uma procedure prática. Vamos criar uma rotina de pedido que recebe tres parametros e inser na tabela pedidos. Em seguida ela remove da tabela produtos a quantidade definida nos parametros. Primeiramente criamos a coluna quantidade na tabela produtos:
Em seguida criamos a procedure:
DROP PROCEDURE IF EXISTS faz_pedido &&
O novo código ficou como a seguir:

Na versão da aula o BD tem tres itens: Tables, Views e Routines. Na versão que estou utilizando a opção Routines é substituida por Stored Procedures e Functions.
Na versão da aula executou-se o comando
SELECT * FROM INFORMATION_SCHEMA.ROUTINES;
para apresentar as rotinas criadas. Na minha versão o retorno desse comando apresenta, aparentemente, algumas funções nativas do MySQL.
Podemos substituir o delimitador de expressões (por padrão é o ';') utilizando o commando DELIMITER:
DELIMITER &&
SELECT * FROM INFORMATION_SCHEMA.ROUTINES&&
Isso é util para a criação de procedures.
Em seguida criamos uma procedure:
DELIMITER &&
CREATE PROCEDURE curso_mysql.PRIMEIRA()
BEGIN
SELECT 'Minha primeira rotina';
END &&
DELIMITER ;
CREATE PROCEDURE curso_mysql.PRIMEIRA()
BEGIN
SELECT 'Minha primeira rotina';
END &&
DELIMITER ;
Para executar uma procedure utilizamos o comando CALL nome_da_procedure:
CALL PRIMEIRA();
Agora vamos criar uma procedure prática. Vamos criar uma rotina de pedido que recebe tres parametros e inser na tabela pedidos. Em seguida ela remove da tabela produtos a quantidade definida nos parametros. Primeiramente criamos a coluna quantidade na tabela produtos:
ALTER TABLE produtos ADD COLUMN estoque INT
DEFAULT 10;
ALTER TABLE produtos ALTER COLUMN estoque DROP DEFAULT;
Utilizei o DEFAULT para preencher
automaticamente todos os campos com o valor definido.
ALTER TABLE produtos ALTER COLUMN estoque DROP DEFAULT;
Em seguida criamos a procedure:
DELIMITER &&
CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=P_id;
END
DELIMITER ;
Essa rotina resultou em um erro por dois motivos.
Primeiro porque não estava definido quais os campos
seriam preenchidos, uma vez que não estavam todos os
valores da tabela. O segundo que o campo de
id naõ esta definido como AUTO_INCREMENT.
Fizemos isso através da interface do Workbench, mas o
comando é o seguinte:
CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=P_id;
END
DELIMITER ;
ALTER TABLE `curso_mysql`.`pedidos`
CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT ;
Em seguida alteramos o código da procedure.
Primeiramente criamos uma rotina que verifica se a
procedure já existe e se sim a apaga
automaticamente. CHANGE COLUMN `id` `id` INT NOT NULL AUTO_INCREMENT ;
DROP PROCEDURE IF EXISTS faz_pedido &&
O novo código ficou como a seguir:
DELIMITER &&
DROP PROCEDURE IF EXISTS faz_pedido &&
CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos (produto_id, quantidade, total) VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=p_id;
END &&
DELIMITER ;
DROP PROCEDURE IF EXISTS faz_pedido &&
CREATE PROCEDURE faz_pedido(p_id int, qtd int, valor double)
BEGIN
INSERT INTO pedidos (produto_id, quantidade, total) VALUES(p_id, qtd, valor);
UPDATE produtos SET estoque=estoque-qtd WHERE id=p_id;
END &&
DELIMITER ;
Aula 34 - Criando views
Views são rotinas que são criadas para
facilitar o retorno de requisições do tipo
SELECT.
Criamos views com o comando CREATE VIEW nome_da_view AS rotina de SELECT.
Para executar a view utilizamos o comando:
SELECT * FROM v_clientes_sp; Desse modo sintetizamos os filtros utilizados no SELECT em apenas um comando.

Criamos views com o comando CREATE VIEW nome_da_view AS rotina de SELECT.
CREATE VIEW v_clientes_sp AS
SELECT * FROM clientes WHERE uf='SP';
SELECT * FROM clientes WHERE uf='SP';
Para executar a view utilizamos o comando:
SELECT * FROM v_clientes_sp; Desse modo sintetizamos os filtros utilizados no SELECT em apenas um comando.
Aula 35 a 36- Modelando / Relacionamentos
Podemos criar modelos do BD que é a representação
esquemática das tabelas e views necessárias para o
banco. O MySQL Workbench possui uma ferramenta que cria
esse modelo, seja do zero, seja a partir de um BD
existente.
Podemos criar de modo visual relacionamentos entre as tabelas de modo a facilitar a criação de chaves.
Os relacionamentos entre tabelas podem ser:
1:1 Cada registro em uma tabela está relacionado a um registro em outra tabela.
1:n Cada registro em uma tabela está relacionado a vários registros em outra tabela.
m:n Vários registros em uma tabela podem estar relacionados a vários registros em outra tabela.
Feitas as alterações no modeling podemos transferir para o BD através do menu Database -> Synchronize Model...

Podemos criar de modo visual relacionamentos entre as tabelas de modo a facilitar a criação de chaves.
Os relacionamentos entre tabelas podem ser:
1:1 Cada registro em uma tabela está relacionado a um registro em outra tabela.
1:n Cada registro em uma tabela está relacionado a vários registros em outra tabela.
m:n Vários registros em uma tabela podem estar relacionados a vários registros em outra tabela.
Feitas as alterações no modeling podemos transferir para o BD através do menu Database -> Synchronize Model...