2
respostas

Exercício sql

Alguém pode me ajudar com esse exercício? eu criei as tabelas, PORÉM o intem 6: o cpf continua podendo repetir, mesmo colocando a chave primária Unique; No intem 4 e 5 e 7 e 8 não consegui identificar como faz mesmo com as aulas da alura, tentei pesquisar mas também não encontrei;

--ABAIXO SEGUE O CÓDIGO--

1As tabelas devem ser de primary id auto incrementado; 2Deve existir um relacionamento de 1->N (de 1 para muitos) entre a tabela Cliente e a tabela Endereco (ou seja, um cliente pode ter vários endereços); 3Deve existir um relacionamento de 1->N (de 1 para muitos) entre a tabela Cliente e a tabela Produto (ou seja, um cliente pode ter vários produtos); 4Um produto só pode ter um cliente vinculado a ele; 5Um endereço só pode ter um cliente vinculado a ele; 6 O CPF da tabela Cliente deve ser único nela (ou seja, não podemos ter 2 clientes com o mesmo CPF); 7 O preço do produto não pode ser negativo; 8 O campo Tipo da tabela Endereco só pode receber dados como rua, avenida ou quadra; algo diferente disso não pode permitir persistir na tabela.

Abaixo segue o código no Pgamin4:

DROP TABLE cliente; CREATE TABLE cliente ( id serial PRIMARY KEY, nome VARCHAR(255) NOT NULL, cpf CHAR(11) NOT NULL );

INSERT INTO cliente (nome, cpf) VALUES ('João Santos', '01234567890'); INSERT INTO cliente (nome, cpf) VALUES ('Pedro Ribeiro', '09876543210');

--achave primária não funcina, ta deixando colocar o mesmo cpf em clientes diferentes;-- INSERT INTO cliente (nome, cpf) VALUES ('santi dário', '09876543210');

SELECT * FROM cliente;

DROP TABLE endereço; CREATE TABLE endereço ( id serial PRIMARY KEY, logradouro VARCHAR(255) NOT NULL, numero INTEGER NOT NULL, bairro VARCHAR(255) NOT NULL, CEP CHAR(8) NOT NULL, cidade VARCHAR(255) NOT NULL, estado VARCHAR(255) NOT NULL );

INSERT INTO endereço (logradouro, numero, bairro, CEP, cidade, estado) VALUES ('Rua André Gonçalves', 136, 'imbuí', 41741020, 'Salvador', 'BA'); INSERT INTO endereço (logradouro, numero, bairro, CEP, cidade, estado) VALUES ('Ladeira do Funil', 24, 'Barbalho', 41741010, 'Salvador', 'BA'); INSERT INTO endereço (logradouro, numero, bairro, CEP, cidade, estado) VALUES ('Av. Jorge Amado', 84, 'Imbuí', 41741040, 'Salvador', 'BA');

SELECT * FROM endereço;

DROP TABLE produtos; CREATE TABLE produtos ( id serial PRIMARY KEY, produto VARCHAR(255) NOT NULL, preço numeric(10,2) NOT NULL );

INSERT INTO produtos (id, produto, preço) VALUES (1, 'Camisa', 99.99); INSERT INTO produtos (id, produto, preço) VALUES (2, 'Short', 59.99);

SELECT * FROM produtos;

DROP TABLE cliente_produtos; CREATE TABLE cliente_produtos ( cliente_id INTEGER, produtos_id INTEGER, PRIMARY KEY (cliente_id, produtos_id),

FOREIGN KEY (cliente_id)

REFERENCES cliente (id),

FOREIGN KEY (produtos_id)

REFERENCES produtos (id) );

INSERT INTO cliente_produtos (cliente_id, produtos_id) VALUES (1,1); INSERT INTO cliente_produtos (cliente_id, produtos_id) VALUES (2,1);

INSERT INTO cliente_produtos (cliente_id, produtos_id) VALUES (1,2);

--INSERT INTO cliente_produtos (cliente_id, produtos_id) VALUES (2,1);--

INSERT INTO cliente_produtos (cliente_id, produtos_id) VALUES (2,2);

SELECT * FROM cliente WHERE id = 1; SELECT * FROM produtos WHERE id = 1;

SELECT * FROM cliente WHERE id = 2; SELECT * FROM produtos WHERE id = 1;

SELECT * FROM cliente_produtos;

SELECT * FROM cliente JOIN cliente_produtos ON cliente_produtos.cliente_id = cliente.id JOIN produtos ON produtos.id = cliente_produtos.produtos_id

DROP TABLE cliente_endereço; CREATE TABLE cliente_endereço ( cliente_id INTEGER, endereço_id INTEGER, PRIMARY KEY (cliente_id, endereço_id),

FOREIGN KEY (cliente_id)

REFERENCES cliente (id),

FOREIGN KEY (endereço_id)

REFERENCES endereço (id) );

INSERT INTO cliente_endereço (cliente_id, endereço_id) VALUES (1,1); INSERT INTO cliente_endereço (cliente_id, endereço_id) VALUES (2,2); INSERT INTO cliente_endereço (cliente_id, endereço_id) VALUES (1,3); SELECT * FROM cliente_endereço;

DELETE FROM cliente_endereço WHERE cliente_id = 1;

SELECT * FROM cliente JOIN cliente_endereço ON cliente_endereço.cliente_id = cliente.id JOIN endereço ON endereço.id = cliente_endereço.endereço_id

2 respostas

João vamos por parte.

1- não entendi porque dropou a tabela se, pra mim pelo menos, não estava criada? DROP TABLE cliente;

2- porque utilizou o ID SERIAL ao invés de CPF para criar a primary key? desta forma você não poderá repetir o número mas poderá repetir o CPF

CREATE TABLE cliente ( id serial PRIMARY KEY, nome VARCHAR(255) NOT NULL, cpf CHAR(11) NOT NULL );

Olá, 1- eu dropei pq achei que estivesse errado algo; dropei pra criar novamente. 2- como eu usaria o cpf pra criar a primary key?