Databázy - cvičenie č. 12

Created: 2008-12-03 - 19:42


-- 1) V tempdb si vytvorte tabulku osoba, ktora ma stlpce:
-- id (bude samozrejme primarny kluc), meno, priezvisko, datum narodenia, pohlavie, vyska, vaha.
USE tempdb;
GO
IF OBJECT_ID('osoba') IS NOT NULL DROP TABLE osoba;
GO 

create table osoba(
	id			int not null primary key,
	meno		varchar(10), 
	priezvisko	varchar(20),
	dat_nar		datetime,
	pohlavie	char(1),
	vyska		dec(5,2),
	vaha		dec(5,2)
);

-- 2) Upravte tabulku tak, aby do stlpca pohlavie bolo mozne vkladat len hodnoty 'm' alebo 'z'
IF EXISTS (SELECT Constraint_Name FROM INFORMATION_SCHEMA.Table_CONSTRAINTS
WHERE Constraint_Name = 'checkmz')
	ALTER TABLE osoba DROP CONSTRAINT checkmz;
GO
ALTER TABLE osoba ADD CONSTRAINT checkmz CHECK(pohlavie IN ('m','z'));
GO

INSERT osoba VALUES(1, 'Zuza', NULL, '1987.12.12', 'z', 175.50, 65.50);  -- prejde

--Vlozte do tabulky riadok, kde bude pohlavie = 'd' -- DB to samozrejme nedovoli
INSERT osoba VALUES(2, 'Klara', NULL, '1982.9.9', 'd', 170.00, 60); -- neprejde
-- =>:

----vypnite (NIE ZMAZTE) kontrolu jednoznacnosti vysky vahy a pohlavia (junikPVV)
ALTER TABLE osoba NOCHECK CONSTRAINT checkmz
GO
INSERT osoba VALUES(2, 'Klara', NULL, '1982.9.9', 'd', 170.00, 60) -- prejde
----zapnite naspat kontrolu jednoznacnosti vysky vahy a pohlavia (junikPVV)
ALTER TABLE osoba CHECK CONSTRAINT checkmz
GO

SELECT * FROM osoba


-- 3) Osetrite tabulku tak, aby nebolo mozne vkladat null hodnoty do stlpcov meno a priezvisko
ALTER TABLE osoba ALTER COLUMN meno VARCHAR(20) NOT NULL;

ALTER TABLE osoba ALTER COLUMN priezvisko VARCHAR(20) NOT NULL; -- neprejde
GO
-- =>:
UPDATE osoba SET priezvisko = 'Moja' WHERE id=1 or id=2;
ALTER TABLE osoba ALTER COLUMN priezvisko VARCHAR(20) NOT NULL; -- prejde

INSERT osoba VALUES(3, 'Zsoka', 'Moja', '1982.9.9', 'z', 170.00, 60) -- prejde
SELECT * FROM osoba

-- 4) Zabezpecte, aby trojica pohlavie, vyska a vaha bola jedinecna (jednoznacna)
ALTER TABLE osoba ADD CONSTRAINT junikPVV UNIQUE(pohlavie, vaha, vyska);
GO

--Vlozte riadok, ktory nedodrziava toto obmedzenie:
INSERT osoba VALUES(4, 'Ti', 'Moja', '1982.9.9', 'z', 170.00, 61) -- prejde
INSERT osoba VALUES(5, 'Tu', 'Moja', '1982.9.9', 'z', 170.00, 62) -- neprejde

-- 4) Zmazte stlpec vyska:
ALTER TABLE osoba DROP COLUMN vyska; --nepovoli
-- =>:
ALTER TABLE osoba DROP CONSTRAINT junikPVV;
ALTER TABLE osoba DROP COLUMN vyska;

-- 5a) UPRAVTE stlpec pohlavie s default hodnotou 'm' s povolenymi hodnotami 'm' a 'z' priamo v def.
ALTER TABLE osoba DROP CONSTRAINT checkmz;
ALTER TABLE osoba DROP column pohlavie;
GO
----------ALTER TABLE osoba ADD CONSTRAINT checkmz CHECK(pohlavie IN ('m','z')); -- predtym.
ALTER TABLE osoba ADD pohlavie CHAR(1) DEFAULT 'm' CHECK(pohlavie IN ('m','z'));
GO

-- 5b) Vlozte dva platne riadky do tabulky:
SELECT * FROM osoba -- aby sme videli stav a stlpce:
INSERT osoba(id, meno, priezvisko, dat_nar, vaha) VALUES(5, 'Tu', 'Moja', '1982.9.9', 61) -- prejde
INSERT osoba(id, meno, priezvisko, dat_nar, vaha, pohlavie) 
												  VALUES(6, 'Tina','Moja','1982.9.9', 62, 'z') -- prejde
SELECT * FROM osoba


-- 6) vytvorte tabulkU osoba, tak ako predtym, ale s tymito obmedzeniami:
--  a) meno a priezvisko nesmu byt null
--  b) pohlavie musi byt 'm' alebo 'z'
--  c) trojica stlpcov pohlavie vyska a vaha budu jednoznacne
--  d) v stlpcoch vyska a vaha nesmu byt nekladne hodnoty (vyska,vaha >0)
--  e) navyse bude mat stlpec mobilne_cislo a to bude vo formate +412xxxxxxxxx
DROP TABLE osoba;
CREATE TABLE osoba(
	id			INT NOT NULL PRIMARY KEY,
	meno		VARCHAR NOT NULL,
	priezvisko	varchar(20) NOT NULL,
	dat_nar		datetime,
	pohlavie	char(1) DEFAULT 'M' CONSTRAINT checkPohlavieMZ CHECK(pohlavie IN ('M','Z')),
	vyska		dec(5,2) CONSTRAINT kladna_vyska CHECK(vyska > 0),
	vaha		dec(5,2),
	tel_cislo char(13) CHECK(tel_cislo LIKE '+421[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
	CONSTRAINT junikPVV UNIQUE(pohlavie, vyska, vaha),
	CHECK(VAHA > 0)
);

------------------------
-- 7a) Uvazujme tabulku Kniha z DB GammaVydavatel: 
IF OBJECT_ID('Kniha') IS NOT NULL DROP TABLE Kniha;
GO 
CREATE TABLE Kniha(
	id int identity(1,1) not null primary key,
	nazov varchar(50) not null
); 

-- 7b) Chceme rozsirit DB tak, aby bolo mozne ukladat aj krajinu 
--    (jej skratku a cely nazov) povodu knihy.
IF OBJECT_ID('Krajina') IS NOT NULL DROP TABLE Krajina;
GO 
CREATE TABLE Krajina(
	id int identity(10,10) not null primary key,
	nazov varchar(50),
	skratka char(3)
);
ALTER TABLE Kniha ADD id_krajina INT CONSTRAINT fk_krajina 
						FOREIGN KEY (id_krajina) REFERENCES krajina(id);

-- 7c) Vlozte jeden platny a jeden neplatny riadok do oboch tabuliek Kniha, Krajina.
INSERT Krajina VALUES('Slovensko', 'Sk')
GO
SELECT * FROM Krajina

SELECT * FROM Kniha
INSERT Kniha VALUES('Biblia', 10)
SELECT * FROM Kniha