Anoche en una fiesta conociste a Bernie Ecclestone y le
convenciste para crear una base de datos para gestionar el campeonato del mundo
de Fórmula 1.
Partiendo del siguiente esquema relacional, crea las
tablas correspondientes, teniendo en cuenta el tipo y tamaño de los campos, las
claves primarias (negrita y subrayado)  y
ajenas (cursiva) y las restricciones indicadas. Debes incluir inserciones de
registros de prueba para demostrar el funcionamiento correcto de las
restricciones.
a) Tabla
Pilotos 
| 
PILOTOS | ||
| 
Código | 
Cadena de caracteres,
  tamaño 3 |  | 
| 
Nombre | 
Cadena de caracteres,
  tamaño 15 | 
Iniciales en mayúsculas | 
| 
Nacionalidad | 
Cadena de caracteres,
  tamaño 15 | 
Brasileña,
  Española, Inglesa o Alemana | 
| 
FechaNacimiento | 
Fecha/Hora |  | 
| 
CarreraDebut | 
Cadena de caracteres,
  tamaño 20 | 
Los cuatro últimos
  caracteres son el año y están entre 1990 y 2010. | 
| 
NombreEscuderia | 
Cadena de caracteres,
  tamaño 20 |  | 
b) Tabla
Circuitos 
| 
CIRCUITOS | ||
| 
Nombre | 
Cadena de Caracteres,
  tamaño 15 | 
En mayúsculas | 
| 
País | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Tipo | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Longitud | 
Numérico hasta 9999'9 | 
Mayor de 2400 | 
| 
Diseñador | 
Cadena de Caracteres,
  tamaño 20 | 
Iniciales en mayúsculas | 
c) Tabla Carreras 
| 
CARRERAS | ||
| 
NombreGP | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Año | 
Cadena de Caracteres, tamaño
  4 | 
Del siglo XXI | 
| 
FechaHoraInicio | 
Fecha/Hora | 
De Marzo a Noviembre | 
| 
NumVueltas | 
Numérico hasta 99 |  | 
| 
NombreCircuito | 
Cadena de Caracteres,
  tamaño 15 |  | 
d) Tabla Escuderías 
| 
ESCUDERIAS | ||
| 
Nombre | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Propietario | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
FabricanteMotor | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Sede | 
Cadena de Caracteres,
  tamaño 15 | 
Contiene Inglaterra,
  Alemania o Italia | 
e) Tabla Resultados 
| 
RESULTADOS | ||
| 
NombreGP | 
Cadena de Caracteres,
  tamaño 15 |  | 
| 
Año | 
Cadena de Caracteres,
  tamaño 4 |  | 
| 
CodPiloto | 
Cadena de Caracteres,
  tamaño 4 |  | 
| 
Puesto | 
Numérico hasta 99 |  | 
| 
DistanciaGanador | 
Cadena de Caracteres,
  tamaño 8 |  | 
Añade las restricciones
siguientes, una vez creadas las tablas e insertados algunos registros:
-                     
El código de
piloto sólo tiene caracteres numéricos, aunque sigue siendo de tipo Cadena 
-                     
Distancia al
Ganador: Formato '+mm:ss.cc' (siendo mm<10) o Abandono o campo vacío. 
-                     
FechaHoraInicio:
De las 13:00 a las 21:30. 
-                     
Nombre del Piloto:
Obligatorio. 
-                     
No hay más de un
circuito en el mismo país. 
-                     
Tipo: Urbano o
campo vacío. 
-                     
Deshabilita
temporalmente la restricción referente a la sede de la escudería. 
CREATE TABLE pilotos (
codigo VARCHAR2(3),
nombre VARCHAR2(15),
nacionalidad VARCHAR2(15),
fechanac DATE,
carreradeb VARCHAR2(20),
nombreesc VARCHAR2(15),
CONSTRAINT PK_pilotos PRIMARY KEY (codigo),
CONSTRAINT FK_nombreesc FOREIGN KEY (nombreesc)
REFERENCES escuderias(nombre),
CONSTRAINT CK_nombre CHECK (nombre=INITCAP(nombre)),
CONSTRAINT CK_nacion CHECK (upper(nacionalidad) IN
('BRASILEÑA','ESPAÑOLA','INGLESA','ALEMANA')),
CONSTRAINT
CK_carrera CHECK (TO_NUMBER(substr(carreradeb, -4, 4)) BETWEEN 1990 AND 2010)
);
INSERT INTO pilotos
VALUES ('111','Nombre','inglesa','02-02-1222','1990','pepe');
INSERT INTO pilotos
VALUES ('112','Nombre','española','02-02-1222','1990','pepe2');
INSERT INTO pilotos
VALUES ('132','Nombre','inglesa','02-02-1222','1990','pepe3');
INSERT INTO pilotos
VALUES ('232','Nombre','inglesa','02-02-1222','1990','pepe3');
INSERT INTO pilotos
VALUES ('332','Nombre','inglesa','02-02-1222','1990','pepe3');
INSERT INTO pilotos
VALUES ('432','Nombre','inglesa','02-02-1222','1990','pepe3');
CREATE TABLE
circuitos (
nombre VARCHAR2(15),
pais VARCHAR2(15),
tipo VARCHAR2(15),
longitud
NUMBER(5,1),
disenador
VARCHAR2(20),
CONSTRAINT
PK_circuitos PRIMARY KEY (nombre),
CONSTRAINT
CK_nombre_cir CHECK (nombre=UPPER(nombre)),
CONSTRAINT
CK_longitud CHECK (longitud > 2400),
CONSTRAINT
CK_disenador CHECK (disenador=INITCAP(disenador))
);
INSERT INTO
circuitos VALUES ('MADRID','alemania','urbano',2450,'Falta');
INSERT INTO
circuitos VALUES ('ZARA','italia','urb',2450,'Falta');
CREATE TABLE
carreras (
nombregp
VARCHAR2(15),
ano VARCHAR2(4),
fechahorainicio DATE,
numvueltas NUMBER(2),
nombrecircuito VARCHAR2(15),
CONSTRAINT PK_carreras PRIMARY KEY (nombregp, ano),
CONSTRAINT FK_nomcir
FOREIGN KEY (nombrecircuito) REFERENCES circuitos (nombre),
CONSTRAINT CK_ano
CHECK (TO_NUMBER(ano) BETWEEN 2001 AND 2100),
CONSTRAINT
CK_fechahi CHECK (TO_NUMBER(TO_CHAR(fechahorainicio,'MM')) BETWEEN 03 AND 11)
);
INSERT INTO carreras VALUES
('este','2020','01-03-1993',87,'MADRID');
CREATE TABLE escuderias (
nombre VARCHAR2(15),
propietario VARCHAR2(15),
fabricantemotor VARCHAR2(15),
sede VARCHAR2(15),
CONSTRAINT
PK_escuderias PRIMARY KEY (nombre),
CONSTRAINT CK_sede
CHECK (upper(sede) IN ('INGLATERRA','ALEMANIA','ITALIA'))
);
INSERT INTO escuderias VALUES
('pepe','manolo','alguien','italia');
INSERT INTO escuderias VALUES
('pepe2','manolo','alguien','italia');
INSERT INTO escuderias VALUES
('pepe3','manolo','alguien','italia');
CREATE TABLE resultados (
nombregp VARCHAR2(15),
ano VARCHAR2(4),
codpiloto VARCHAR2(3),
puesto NUMBER (2),
distancia_ganador VARCHAR2(8),
CONSTRAINT PK_resultados PRIMARY KEY(nombregp, ano,
codpiloto),
CONSTRAINT FK_carreras FOREIGN KEY (nombregp, ano)
REFERENCES carreras (nombregp, ano),
CONSTRAINT FK_pilotos FOREIGN KEY (codpiloto)
REFERENCES pilotos (codigo)
);
INSERT INTO
resultados VALUES ('este','2020','332',20,'09');
ALTER TABLE pilotos
ADD CONSTRAINT CK_codigo CHECK (substr(codigo,1,1) BETWEEN '0' AND '9') AND
(substr(codigo,2,1) BETWEEN '0' AND '9') AND (substr(codigo,3,1) BETWEEN '0'
AND '9');
ALTER TABLE pilotos
ADD CONSTRAINT CK_codigo CHECK (TO_NUMBER(codigo) BETWEEN 0 AND 999);
ALTER TABLE pilotos
ADD CONSTRAINT CK_nombrenulo CHECK (nombre IS NOT NULL);
// esto no funciona!!! probablemente por parentesis
ALTER TABLE carreras
ADD CONSTRAINT CK_hora_inicio CHECK
(TO_NUMBER(TO_CHAR(fechahorainicio,'hh'))>13) 
AND
((TO_NUMBER(TO_CHAR(fechahorainicio,'hh'))<21) 
OR
((TO_NUMBER(TO_CHAR(fechahorainicio,'hh'))=21) AND
(TO_NUMBER(TO_CHAR(fechahorainicio,'mi'))<=30)))
);
//
ALTER TABLE
circuitos ADD CONSTRAINT UK_nombre UNIQUE (pais);
ALTER TABLE
circuitos ADD CONSTRAINT CK_tipoalgo CHECK ((upper(tipo)='URBANO') OR (tipo IS
NULL));
ALTER TABLE
circuitos DROP CONSTRAINT CK_tipoalgo;
ALTER TABLE
escuderias DISABLE CONSTRAINT CK_sede;
ALTER TABLE
resultados ADD CONSTRAINT CK_distancia CHECK
((upper(distancia_ganador)='ABANDONO') 
OR
(distancia_ganador IS NULL) 
OR (TO_NUMBER(SUBSTR(distancia_ganador,1,2)) < 10));
ALTER TABLE resultados DROP CONSTRAINT CK_distancia;
No hay comentarios:
Publicar un comentario