Êý¾Ý¿â¸´Ï°">Êý¾Ý¿â¸´Ï°
CH5 ÍêÕûÐÔ
5.1 ÍêÕûÐÔÔ¼Êø
Êý¾Ý¿âÍêÕûÐÔÊÇÖ¸Êý¾Ý¿âÖÐÊý¾ÝÔÚÂß¼ÉϵÄÒ»ÖÂÐÔ¡¢ÕýÈ·ÐÔ¡¢ÓÐЧÐÔºÍÏàÈÝÐÔ£¬ÄÇôÍêÕûÐÔÔ¼Êø¾ÍÊÇÖ¸Óû§²åÈë¡¢Ð޸ĺÍɾ³ý²Ù×÷ʱ£¬DBMSΪÁ˱£Ö¤Êý¾Ý¿âÂß¼ÉϵÄÒ»ÖÂÐÔ¡¢ÕýÈ·ÐÔ¡¢ÓÐЧÐÔºÍÏàÈÝÐÔËù±ØÐèÒª¼ì²éµÄÔ¼ÊøÌõ¼þ
C.J.DateÔÚ¡¶An Introduction to Database Systems¡·Ò»ÊéÖÐÃèÊöÁËËÄÖÖÍêÕûÐÔÔ¼Êø£º
ÀàÐÍÔ¼Êø ÊôÐÔÔ¼Êø ¹ØÏµ±äÁ¿Ô¼Êø Êý¾Ý¿âÔ¼Êø
C.J.DateÌá³öµÄÀíÂÛ¶à°ëÊǽ¨Á¢ÔÚËû×Ô´´µÄTutorial DÕâ¸ö¸ÅÄîÐÍÊý¾Ý¿â²Ù×÷ÓïÑÔÉϵģ¬ÏÂÃæµÄÃèÊöÒ²ÊÇ»ùÓÚTutorial D£¬×¢Òâ²»ÒªºÍSQL»ìÏý
£¨1£©ÀàÐÍÔ¼Êø
ÀàÐÍÔ¼ÊøÊǹØÓÚ×Ô¶¨ÒåÀàÐ͵ÄÖÖÀࣨ»ò¾ÍÊÇÊýÓò£©ÒÔ¼°Öµ´óСµÄÔ¼Êø£¬ÀýÈçÎÒÃÇ×Ô¶¨ÀàÐÍweightÊÇʵÊýÀàÐÍÇÒÒªÇóweight±ØÐë´óÓÚ0£¬ÄÇôÓÃTutorial D¶¨ÒåÒ»¸öÀàÐÍÔ¼ÊøÈçÏ£º
TYPE weight POSSREP(RATIONAL) CONSTRAINT the_weight(weight) > 0.0;
POSSREPÊÇpossible representation£¨¿ÉÄܵıí´ï·½Ê½£©£¬RATIONALÊÇÓÐÀíÊý£¬the_¼Óweight£¨Ç°ÃæÌáµ½¹ýÕâÊÇC.J.DateÌá³öµÄ¶ÔÀàÐ͵IJÙ×÷·ûºÅ£¬±íʾȡֵ£©weight×÷ÓÃÓÚweight±íʾȡֵ
£¨2£©ÊôÐÔÔ¼Êø
ÊôÐÔÔ¼Êø¾ÍÊǶ¨Òå¹ØÏµÊ±¶¨ÒåÊôÐÔµÄÀàÐͲúÉúµÄÒþÊ½Ô¼Êø£¬Tutorial D¶¨ÒåÒ»¸ö¹ØÏµÈçÏ£º
VAR S BASE RELATION(S# S#, status integer, city char);
±ÈÈçÉÏÀýµÄstatus¾ÍÐèÒªÒþʽ×ñÊØÀàÐÍintegerµÄÀàÐÍÔ¼Êø
£¨3£©¹ØÏµ±äÁ¿Ô¼Êø
¹ØÏµ±äÁ¿Ô¼ÊøÊǶԹØÏµÖÐÔª×éµÄÔ¼Êø£¬ÈçÏÞ¶¨ÔÚÂ׶صũӦÉÌ״̬һ¶¨ÊÇ20£º
Constraint sc1 is_empty(S where city = 'London' and status ~= 20);
¹ØÏµ±äÁ¿Ô¼Êø×ÜÊÇÁ¢¼´¼ì²éµÄ
£¨4£©Êý¾Ý¿âÔ¼Êø
¹ØÏµ±äÁ¿Ô¼ÊøÊÇÕë¶Ôµ¥¸ö¹ØÏµ±äÁ¿ÄÚ²¿ÊôÐÔµÄÔ¼Êø£¨¿ÉÒ԰ѹØÏµ±äÁ¿¾ÍÀí½âΪ¹ØÏµ/±í£©£¬ÈôÔ¼ÊøÉæ¼°¶à¸ö¹ØÏµ±äÁ¿£¬Ôò³ÆÖ®ÎªÊý¾Ý¿âÔ¼Êø
ÈçϵÄÊý¾Ý¿âÔ¼Êø£¬ÏÞ¶¨Áã¼þÉ̵ĸöÊý±ØÐëµÈÓÚ¹©Ó¦±íÖÐÁã¼þÉ̵ĸöÊý£º
Constraint dbc1 count(SP(p#)) = count(P(p#));
£¨5£©Ô¼ÊøÉè¼ÆµÄ»Æ½ð×¼Ôò£¨Golden Rule£©
¹ØÓÚGolden Rule£¬C.J.DateÔÚÕâÀïÏëÒª±í´ïµÄÊÇÎÒÃǶ¨ÒåµÄËùÓÐÍêÕûÐÔÔ¼Êø¶¼³ÆÖ®ÎªÄÚ²¿Ô¼Êø£¬Óû§ºÍDBMS¶¼ºÜÇå³þ£¬±ÈÈçÌåÖØ±ØÐë´óÓÚ0
È»¶øÎÒÃÇÉè¼ÆµÄϵͳ»¹ÓкܶàÆäËûµÄÍâ²¿Ô¼Êø£¬±ÈÈç˵ÎÒµÄÌåÖØÊÇ69.5£¬ÄÇô¿ÉÒÔ²åÈëÒ»¸öÔª×é(jcguo, 69.5)£¬µ«ÊDzåÈë(jcguo, 100.5)˵ÎÒÊǸö´óÅÖ×ÓDBMSÒ²ÊÇÔÊÐíµÄ£¬µ«ÕâÎ¥·´ÁËÏÖʵÊÀ½çµÄÔ¼Êø
Õâ½ìÉæ¼°µ½Ö®Ç°ÔÚÍêÕûÐÔ¶¨ÒåÖаüÀ¨µÄÕýÈ·ÐÔ£¬C.J.DateÈÏΪÕⲿ·ÖµÄÍêÕûÐÔÓ¦¸ÃÓÉÓû§»òÕß˵DBAÔÚÊý¾Ý¿âÍⲿÏÞ¶¨£¬¶ø²»Êǽ»¸øDBMS
5.2 ¼üKey
Êý¾Ý¿âÖпÉÒÔ¶¨ÒåÒ»ÖÖÌØÊâµÄÍêÕûÐÔÔ¼Êø¡ª¡ª¼ü£¨key£¬»òÕßÓÐʱҲ·ÒëΪÂ룬Îҽмü±È½Ï˳¿Ú£©
£¨1£©¸÷ÖÖ¼üµÄ¶¨Òå
ÎÒÃÇÏÈÀ´ÅªÇå³þ¸÷ÖÖ¼üµÄ¶¨Ò壺
super key£º³¬¼ü£¬ÔÚ¹ØÏµÖÐÄܹ»Î¨Ò»±êʶԪ×éµÄÊôÐÔ¼¯ candidate key£ººòÑ¡¼ü£¨Ò»°ã½ÐºòÑ¡Â룩£¬²»º¬ÓжàÓàÊôÐÔ/²»¿É¹æÔ¼µÄ³¬¼ü primary key£ºÖ÷¼ü£¬Óû§Ñ¡×öΨһ±íʶԪ×éµÄºòÑ¡¼ü£¬Ö÷¼ü²»ÄÜΪnull alternate key£º¿ÉÑ¡¼ü£¬ºòÑ¡¼üÖгýÁËÖ÷¼üÒÔÍ⣬ûÓб»Óû§Ñ¡ÖеĺòÑ¡¼ü foreign key£ºÍâ¼ü£¬ÊÇÒÀÀµÓÚÆäËû¹ØÏµÓÃÓÚ±£Ö¤Êý¾Ý¿âÂß¼ÍêÕûÐÔµÄÔ¼Êø
ǰËĸökey¶¼ºÜºÃÀí½â£¬ÏÂÃæ×ÅÖØÀí½âÒ»ÏÂÍâ¼ü
£¨2£©Íâ¼ü
¹ØÏµR1ÉùÃ÷ÔÚÊôÐÔa1ÉÏ´´½¨Íâ¼üFK£¬ÄÇôÓУº
Õâ¸öÍâ¼üFK±ØÐëreference£¨ÒýÓÃorÒÔÀ´£©ÓÚÁíÒ»¸ö¹ØÏµR2µÄºòÑ¡¼üCK£¨Ò»°ãreferenceÁíÒ»¸ö¹ØÏµµÄÖ÷¼ü£¬ÉèCK´´½¨ÓÚÊôÐÔa2ÉÏ£© Õâ¸öreferenceµÄ×÷ÓþÍÊDZ£Ö¤R1ÖÐÊôÐÔa1ÖгöÏÖµÄֵȫ²¿¶¼ÔÚR2µÄa2ÖгöÏÖ£¨ÍêÕûÐÔÔ¼Êø£©
×¢Ò⣬Íâ¼üFK²¢²»ÒªÇóR2ÖÐÊôÐÔa2£¨CK£©ÖгöÏÖµÄÖµ¶¼±ØÐëÔÚR1ÖÐÊôÐÔa1ÖгöÏÖ£¬Ö»ÊÇ˵µ¥·½ÃæµÄÔ¼Êø£ºÒ»µ©ÔÚFKÖгöÏÖÔò±ØÐëÔÚCKÖгöÏÖ
Íâ¼ü»¹ÓÐÁíÒ»¸ö×îÖØÒªµÄÌØÐÔ£ºreferential action£¨¹ØÁª¶¯×÷£©£¬¹ØÁª¶¯×÷ÊÇÒ»¸öÒþʽµÄÌØÊâµÄ´¥·¢Æ÷£¨Ã¿µ±Âú×ã³ö·¢Ìõ¼þʱ¶¼»á³ö·¢µÄ¶¯×÷¼¯ºÏ£©
ÏÂÃæÔÚ½²SQLÍêÕûÐÔʱ»áÏêϸ²ûÊöSQLËùÖ§³ÖµÄ¹ØÁª¶¯×÷
5.3 SQLÍêÕûÐÔ
ÔÙ´ÎÇ¿µ÷֮ǰÎÒÃǸ´Ï°µÄËùÓÐÍêÕûÐÔ¶¼ÊdzéÏóÐԵĸÅÄÐèÒªÀí½â£¬ÄÇôÕâһС½ÚSQLÍêÕûÐÔÔòÐèÒª¼ÇÒäÁË
£¨1£©ÓòÔ¼Êø
ÓòÔ¼Êø£¨Domain Constraints£©ÊÇSQLÖжÔÊôÐÔȡֵ·¶Î§µÄÔ¼Êø£¬SQLÉùÃ÷ÓòÔ¼ÊøÊÇÔÚcreate tableʱÍê³ÉµÄ£¬Ö§³Ö´øÃû³ÆµÄÏÔÊ½Ô¼ÊøÉùÃ÷ÒÔ¼°²»´øÃû³ÆµÄ±ã½ÝÔ¼ÊøÉùÃ÷Á½ÖÖ·½Ê½£º
create table Student( S# char(10), name char(20), gender char(1), constraint gc check (gender in ('F', 'M')) );
ºÍÏÂÃæµÈ¼Û£º
create table Student( S# char(10), name char(20), gender char(1) check (gender in ('F', 'M')) );
check´Ó¾äÖпÉÒÔʹÓó£ÓõıȽϹØÏµ²Ù×÷·ûºÅ£¬Ò²¿ÉÒÔʹÓÃin¹¹Ô츴ºÏÓï¾ä
¸øÔ¼ÊøÃüÃûÊÇΪÁËÄ³Ð©ÌØÊâÇé¿öÎÒÃÇÐèÒª¶ÔÔ¼Êø½øÐÐÐ޸쬼ûÎÒÁíÍâһƪ²©ÎÄ£º
ÁíÍâSQLÖ§³Ö¶ÔÒÑÉùÃ÷µÄtableÌí¼ÓÔ¼Êø£¬Ê¹ÓÃalter tableÓï¾ä£¬±¾¿Î³ÌÔݲ»ÒªÇó
£¨2£©Ö÷¼ü
SQLÖ÷¼üÉùÃ÷Ò²ÊÇÔÚcreate tableʱÉùÃ÷µÄ£¬ÉùÃ÷Ö÷¼üÒ²ÓÐÁ½ÖÖ·½Ê½£¨ÏÔʽºÍ±ã½Ýʽ£¬ÏÔʽÖ÷¼ü²»ÐèÒªÃû×Ö£¬ÒòΪһ¸ö¹ØÏµ/±íÖ»ÄÜÓÐÒ»¸öÖ÷¼ü£©£º
create table Student( S# char(10), name char(20), gender char(1) check (gender in ('F', 'M')), primary key (S#) );
µÈ¼ÛÓÚ£º
create table Student( S# char(10) primary key, name char(20), gender char(1) check (gender in ('F', 'M')) );
ÐèҪעÒâµÄÊÇÖ÷¼ü²»ÄÜΪ¿Õ£¬²»ÄܲåÈëÒ»Ìõ²»°üº¬Ö÷¼ü/Ö÷¼üΪnullµÄÔª×é
primary keyÒ²¿ÉÒÔ×÷ÓÃÓÚ¶à¸öÊôÐÔ£¬ÈçÍ¬Ç°Ãæ¸ÅÄî½²½âÖÐËùÌáµ½µÄ£¬ÈçºÎÉè¼ÆÒÀÐèÇó¶ø¶¨
£¨3£©unique
SQLÖÐʵÏÖºòÑ¡ÂëʹÓÃuniqueÔ¼Êø£¬Ò»¸ö¹ØÏµ¿ÉÒÔÓжàÌõuniqueÔ¼Êø
Õâ¾ä»°·Òë×ÔÀÏʦppt£¬¸öÈ˾õµÃÐèÒª²¹³ä£º
SQLÖе»¯ÁËcandidate keyµÄ¸ÅÄî uniqueÔ¼Êø²»½ö¿ÉÒÔʵÏÖºòÑ¡Â룬Ҳ¿ÉÒÔʵÏÖ³¬Â룬Ҳ¾ÍÊÇËüûÓв»¿ÉÔ¼µÄÏÞÖÆ
ÉùÃ÷uniqleÔ¼ÊøºÍÖ÷¼üÀàËÆ£¬¾ÙÀýÂÔ
£¨4£©Íâ¼ü
Foreign key֮ǰÁôÁ˸ö¿Ó£¬ÕâÀïÖ±½Ó¾ÙÀý°É£º
create table Dept( D# char(3) primary key, name char(20), type char(20) check (type in ('engineering', 'science', 'business')) );
ÏÈ´´½¨ÁËÒ»¸ötable DeptÊÇϵµÄ¹ØÏµ£¬ËüµÄÖ÷¼üÊÇD#