复杂的"约束"
数据库MovieStar包含5个关系,它们是:
电影信息Movie (Movie_no , title, year, length, incolor(是否彩色),cert#(制片公司编号))
影星参加StarsIn (Movie_no , StarName(影星名))
影星信息MovieStar (Star_Name, address, gender, birthday)
制片公司行政执行长官MovieExec (Exec_Name, address, cert#, netWorth(净资产))
制片公司Studio(Studio_name, address, cert#)
用Transact-SQL 完成下列操作:
1.添加约束:1939年以前的电影不会是彩色的。
2.添加约束:影星不会出现在他们出身之前的电影里。
问题点数:50、回复次数:8Top
1 楼yesyesyes()回复于 2005-04-19 07:55:07 得分 0
用约束?
还是用触发器吧.Top
2 楼friendliu(无为)回复于 2005-04-19 08:02:09 得分 0
触发器容易实现
Top
3 楼zjcxc(邹建)回复于 2005-04-19 08:33:23 得分 30
--数据库MovieStar包含5个关系,它们是:
--电影信息
create table Movie(
Movie_no int,
title varchar(100),
year int,
length int,
incolor bit,
cert nvarchar(10))
--影星参加
create table StarsIn (
Movie_no int,
StarName nvarchar(10))
--影星信息
create table MovieStar (
StarName nvarchar(10),
address nvarchar(10),
gender char(1),
birthday datetime)
go
--制片公司行政执行长官MovieExec (Exec_Name, address, cert#, netWorth(净资产))
--制片公司Studio(Studio_name, address, cert#)
--1.添加约束:1939年以前的电影不会是彩色的。
alter table Movie
add check(year>1939 or incolor=1) --1939年以前的电影不会是彩色的
go
--2.添加约束:影星不会出现在他们出身之前的电影里。
create function f_check(@StarName nvarchar(10))
returns bit
as
begin
return(case
when exists(
select * from Movie m,StarsIn si,MovieStar s
where s.StarName=@StarName
and si.StarName=@StarName
and m.Movie_no=si.Movie_no
and m.year>year(s.birthday))
then 1 else 0 end)
end
go
alter table StarsIn
add check(dbo.f_check(StarName)=0)
alter table MovieStar
add check(dbo.f_check(StarName)=0)
go
drop table Movie,StarsIn,MovieStar
drop function f_check
Top
4 楼ricleon(寒浪)回复于 2005-04-19 08:44:42 得分 0
UPTop
5 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-04-19 08:54:02 得分 10
1.添加约束:1939年以前的电影不会是彩色的。
alter table Movie
add check(year>1939 or incolor='no')
2.影星不会出现在他们出身之前的电影里。--這里只是一個查詢。
select * from Movie m,StarsIn si,MovieStar ms
where ms.StarName=si.StarName
and m.Movie_no=si.Movie_no
and m.year>year(ms.birthday)Top
6 楼ray680719(HAPPYWORLD)回复于 2005-04-19 09:00:04 得分 0
数据约束和查询两码事。Top
7 楼ray680719(HAPPYWORLD)回复于 2005-04-19 09:13:20 得分 0
更正zjcxc
--1.添加约束:1939年以前的电影不会是彩色的。
alter table Movie
add check(year>1939 or incolor=0) --1939年以前的电影不会是彩色的
Top
8 楼xspf()回复于 2005-04-19 10:39:25 得分 10
create function f_check(@StarName nvarchar(10))
returns bit
as
begin
return(case
when exists(
select * from Movie m,StarsIn si,MovieStar s
where s.StarName=@StarName
and si.StarName=@StarName
and m.Movie_no=si.Movie_no
--and m.year>year(s.birthday))应该是<
and m.year<year(s.birthday))
then 1 else 0 end)--1表示出现过,0表示未出现
end
go
Top




