• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

MIMP

duvida na criaçao de base de dados....

8 mensagens neste tópico

boas....

estou a resolver uns exercicios das aulas...mas estou a ter dificuldade em criar a base de dados, pois dá-me erro ao meter a correr no mysql...

drop database if exists video_clube_xpto;
create database video_clube_xpto;
use video_clube_xpto;

create table modalidade (
cod_modalidade integer not null,
preco char(10),
multa char(10),
designacao char(20),

primary key (cod_modalidade));

create table aluguer(
multa char(5),
num_aluguer integer not null,
preco char(6),
data_aluguer date,
data_entrega date,
cod_modalidade integer not null,
num_socio integer not null,
cod_filme integer not null,
num_exemplar integer not null,

primary key (num_aluguer),

FOREIGN KEY (cod_modalidade)
REFERENCES modalidade (cod_modalidade)
ON UPDATE CASCADE
ON DELETE CASCADE,

FOREIGN KEY (num_socio)
REFERENCES socio (num_socio)
ON UPDATE CASCADE
ON DELETE CASCADE,

FOREIGN KEY (cod_filme)
REFERENCES filme (cod_filme)
ON UPDATE CASCADE
ON DELETE CASCADE,

FOREIGN KEY (num_exemplar)
REFERENCES exemplar (num_exemplar)
ON UPDATE CASCADE
ON DELETE CASCADE);


create table exemplar(
num_exemplar integer not null,
preco char(6),
data_aquisicao date,
formato char(5),
cod_filme integer not null,

primary key (num_exemplar,cod_filme),


FOREIGN KEY (cod_filme)
REFERENCES filme (cod_filme)
ON UPDATE CASCADE
ON DELETE CASCADE);

create table filme(
cod_filme integer not null,
duracao char(10),
titulo char(10),

primary key (cod_filme));

create table socio(
num_socio integer not null,
nome char(20),
morada char(20),
telefone integer,
bi integer,
data_nasc date,
data_insc date,

primary key (num_socio));

espero k me possam ajudar....

obrg

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o erro k me dá é este:

"error 1005 (HY000): Can't create table 'video_clube_xpto.aluguer' (errno:150)"

este erro aparece tambem para a tabela exemplar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Se o MySQL retornar o erro de número 1005 de uma instrução CREATE TABLE, e a string de mensagem de erro se referir ao errno 150, então a criação da tabela falhou porque um restrição de chaves estrangeiras não foi formada corretamente

http://dev.mysql.com/doc/refman/4.1/pt/innodb-foreign-key-constraints.html

Penso que é porque estás a referenciar tabelas que ainda não foram criadas, aquando da definição das chaves estrangeiras na tabela "aluguer".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As tabelas têm uma ordem de criação, tens de colocar as que vão ser referenciadas antes das que as referenciam.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As tabelas ja funcionam sem nenhum erro (Obrigados...)

DROP DATABASE IF EXISTS fichaF; 
CREATE DATABASE fichaF;
USE fichaF;

CREATE TABLE socios (
n_socio		              INTEGER(5) NOT NULL, 
nome		  			  CHAR(30) NOT NULL,
morada		      		  VARCHAR(30),
telefone 				  INTEGER (9),
bi 						  INTEGER (9),
data_nasc 				  DATE,
data_insc 				  DATE NOT NULL,

CONSTRAINT ch_candidata_socios UNIQUE (nome,bi),

CONSTRAINT ch_prim_n_socio
	PRIMARY KEY (n_socio)
);

CREATE TABLE filmes (
cod_filme		              INTEGER(5) NOT NULL,
titulo		  				  CHAR(30) NOT NULL,
duracao		     			  TIME,

CONSTRAINT ch_candidata_filmes UNIQUE (titulo),

CONSTRAINT ch_prim_cod_filme
	PRIMARY KEY (cod_filme)
);

CREATE TABLE modalidades (
modalidade		  CHAR(10) NOT NULL,
preco		      DECIMAL(5,2) NOT NULL,
multa_diaria	  DECIMAL(5,2) NOT NULL,

CHECK (preco >=0),
CHECK (multa_diaria >=0),

CONSTRAINT ch_prim_modalidade
	PRIMARY KEY (modalidade)
);

CREATE TABLE copias (
cod_filme	  	 INTEGER(5) NOT NULL,
n_copia		  	 INTEGER(5) NOT NULL,
formato      	 CHAR(3)NOT NULL,
data_aquisicao   DATE, 
preco	  		 DECIMAL(5,2) NOT NULL,

CHECK (formato= 'VHS' AND formato='DVD'),
CHECK (preco>=0),


CONSTRAINT ch_prim_cod_filme_e_n_copia
	PRIMARY KEY (cod_filme,n_copia)
);


CREATE TABLE alugueres (
n_aluguer		      INTEGER(5) NOT NULL,
n_socio		          INTEGER(5) NOT NULL,
cod_filme             INTEGER(5) NOT NULL,
n_copia	              INTEGER(5) NOT NULL,
modalidade		      CHAR(10) NOT NULL,
data_aluguer	      DATE,
data_entrega          DATE,
preco           	  DECIMAL(5,2) NOT NULL,
multa                 DECIMAL (5,2),

CHECK (multa >=0 OR NULL),
CHECK (preco >=0),


CONSTRAINT ch_prim_n_aluguer
	PRIMARY KEY (n_aluguer),

	CONSTRAINT ch_estr_n_socio 
	FOREIGN KEY (n_socio)
	REFERENCES socios (n_socio)
	ON UPDATE CASCADE  
	ON DELETE CASCADE, 

	CONSTRAINT ch_estr_cod_filme 
	FOREIGN KEY (cod_filme,n_copia)
	REFERENCES copias (cod_filme,n_copia) 
	ON UPDATE CASCADE
	ON DELETE CASCADE,

	CONSTRAINT ch_estr_modalidade
	FOREIGN KEY (modalidade)
	REFERENCES modalidades (modalidade)
	ON UPDATE CASCADE 
	ON DELETE CASCADE
);

Agora queria k me ajudassem no seguinte:

tenho k definir uma query em k para cada filme (cod_filme,titulo) tenho de listar o numero de cassetes existentes no clube.

so consego definir a query apenas a contar os filmes com copias em cassetess ('VHS'). Nao consigo colocar a 0 (zero) os 'DVD'.

select  f.cod_filme,titulo,count(*)
from filmes f, copias c
where formato='VHS' and f.cod_filme=c.cod_filme
group by cod_filme;

Obrigado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi. Queres algo tipo

SELECT  f.cod_filme,titulo,count(*), 0
        FROM filmes f, copias c
        WHERE formato='VHS' AND f.cod_filme=c.cod_filme
        GROUP BY cod_filme;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora lembra-te que por omissão o MySQL cria tabelas MyISAM... As tabelas MyISAM, não suportam chaves estrangeiras... Se queres utilizar chaves estrangeiras sugiro que uses tabelas InnoDB.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora