数据库实验问题汇总
(XZ 20080408)
1.PRIMARY KEY和FOREIGN KEY的用法不理解,格式不明确。尤其是后者,有同学不知道FOREIGN KEY()括号里的字段名是谁的?REFERENCES TABLE_NAME()括号里的字段名是从哪里来的?(问题很普遍)
解答:
(1)定义主键的格式:[CONSTRAINT PK_TABLE_NAME] PRIMARY KEY(COLUMN_NAME).其中PK_TABLE_NAME为此约束的名字,可省去,省去时系统自动取名为“PK_”后面跟表的名字。后面小括号里的内容为要将其设为主键的列,可不只一个。若为多个,用“,”分开。
主键的意义在于,可以靠主键将各元组唯一区别开来。将某列定义为主键后,该列的值具有唯一性和非空性。
(2)定义外键格式:[CONSTRAINT FK_KEYNAME] FOREIGN KEY(COLUMN_NAME1) REFERENCES TABLE_NAME(COLUMN_NAME2)。其中,前面部分可省去。FK_KEYNAME为该约束的名字。COLUMN_NAME1是当前表中的某列名,表示其为参照列。TABLE_NAME为被参照表的名字,COLUMN_NAME2为被参照列的名字,存在于被参照表中。
需要注意的是,COLUMN_NAME1和COLUMN_NAME2的名字可以不同,但数据类型及长度必须一致。
2.约束的定义语句不理解,特别是名字的意义。(较普遍)
解答:
约束是为了保证数据库的完整性而存在的。一般的定义格式为:CONSTRAINT CON_NAME …,后面跟具体的约束内容。PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK等都是约束。CON_NAME为此约束的索引(或叫名字),可以不加,但有些约束还是加上名字比较好,像FOREIGN KEY约束,如果取了名字FK_1,那么在想去掉此约束的时候,就直接可以用DROP CONSTRAINT FK_1。
另外,约束分为列约束和表约束,列约束是指在某列定义时后面跟着把约束写上,如下面的PRIMARY KEY约束:
CREATE TABLE Courses(
Cno CHAR(12) CONSTRAINT PK_Courses PRIMARY KEY,
Cname CHAR(30)
)
而表约束是指在表的定义中,单用一条语句说明某约束。如:
CREATE TABLE Courses(
Cno CHAR(12),
Cname CHAR(30),
CONSTRAINT PK_Courses PRIMARY KEY(Cno)
)
3.如何使Scredit列具有“大于等于0”的约束?不知道CHECK约束,或者不会用。(较普遍)
解答:
CHECK约束通过限制用户输入的值来加强域完整性。也就是说为某列加了CHECK约束后,再对该列插入数值时,都要检查是否满足该约束条件。作为一个约束,它满足题2中讲的约束的一般使用规则。CHECK后面可以跟所有WHERE语句中可用的逻辑表达式。例如:
使用CHECK约束来限定F2列只能为0-100分:
CREATE TABLE Table2(
F1 INT,
F2 INT,
[CONSTRAINT CHK_F2] CHECK(F2 >= 0 AND F2 <= 100),
)
4.关于小数类型字段的定义,可否设定精确位数,尤其是小数点后的位数?(很普遍)
解答:
在SQL Server 2000中有两种小数类型:DECIMAL和NUMERIC,和两种近似数值类型:FLOAT与REAL。REAL类型可定义精度为7位的浮点数,存储大小为4个字节。FLOAT类型格式为:FLOAT(n),可定义15位的浮点数,n用于存储科学记数法FLOAT数尾数的位数。DECIMAL与NUMERIC用法基本相同。格式为:DECIMAL(p, s),其中p表示精度大小,s表示小数位数。p最大为38。理论上讲,用FLOAT和DECIMAL都可以确定小数点后的位数。
5.往表中插入数据,只能每次插入一条记录吗?(普遍)
解答:
是的,在SQL Server中,用INSERT … VALUES… 每次只能插入一条记录。
6.对定义了外键的表插入数据时,例如对Reports表插入元组时,总是说插入错误。(较普遍)
解答:
在表中定义了外键之后,对表进行插入时,要注意数据与被引用表中的一致性。要插入的元组中,属于外键的数据必须是在被引用表中存在的。
例如:在Reports中定义Sno为外键,参照表Students中的Sno。那么在Reports表中要插入(‘S88’,foreign key references用法’T02’,’C01’,88)时,如果Students表中没有“S88”这条记录,那么插入失败。
另外,如果这些规定都符合了,但插入语句VALUES()括号里的各字段值顺序跟表中的顺序不一致,也会出现同样的错误提示。
7.在视图上建立的视图,或者在同一个表上建立的两个视图,对他们插入同一条记录时,为什么总是出错?还有在对某一个视图进行插入后,却从视图里看不到刚插入的数据?(普遍)
解答:
(1)要注意一点,对视图的操作实际上都是在对表进行操作。例如:在表Reports上建立了视图CS_View,选出成绩合格的学生选课记录。然后再在CS_View上建立视图VV_View。此时对CS_View插入一条记录(S03,T02,C04,66)后,实际上是在表Reports中插入了这条记录。而再对VV_View插入同一条记录时,它也是对表Reports进行插入。于是由于表Reports中已经存在了此条记录,便会提示插入错误。
(2)在对视图插入一条记录后,没有提示错误,但是在视图中却看不到插入的数据,是因为数据本质上是插入到表中,而视图的定义时又规定了某些选择条件,它只显示满足这些条件的记录。例如:视图CS_View是选出成绩合格的选课记录,在对其插入某记录(…,59)——即成绩为59——之后,记录已存在于表Reports中,但视图CS_View中只显示成绩合格的记录,所以看不到刚插入的数据。
8.在SQL语句的末尾都可以加分号“;”,但是为什么在创建视图的语句后面加了分号会报错?(不太普遍)
解答:
在SQL Server 2000中,查询分析器中的语句规则是,各条语句后面不用加任何标点符号。但鉴于人们的使用习惯,基本上允许在每条语句的后面加上“;”。个别语句可能会有影响。另外也可以用“GO”来隔开各条语句。它的意义在于告诉系统,在两个“GO”之间的语句作为一批去处理。用法如下:
USE University_Mis
GO
CREATE TABLE Table_1(
…)
GO
CREATE TABLE Table_2(
…)
GO
INSERT Table_1 VALUES(…)
GO
INSERT Table_2 VALUES(…)
GO
SELECT * FROM Table_1
SELECT * FROM Table_2
GO
9.为何建了新的用户,却登录不了?(多)
解答:
建立管理员账号(如sa)时,若定义为以WINDOWS验证登录。而建立其它用户,如USER1时,定义为WINDOWS+SQL验证登录。这样USER1无法登录。只有将sa登录方式
改为以WINDOWS+SQL验证登录之后,方可以USER1登录。
若不改SA的登录方式,而是建立USER1时,将其登录方式设为以WINDOWS验证登录,是不行的。因为若数据库拥有者设为以WINDOWS登录后,再建立新用户时,只能从WINDOWS的用户里面选择,也就是选择在WINDOWS系统域内的用户名。
10.对选课记录表Reports的一个查询,对于及格的学生,将其成绩换算成积分,对于不及格者将其成绩置0,好像是两个查询操作,怎么生成到一个表中?(多)
解答:
这种条件相悖(或者说不能放在同一个WHERE后)的SELECT操作,要将结果生成到一张表中,可以用UNION实现。
11.INSERT一条记录时,为什么格式都正确,但是插入不进去?提示说:“将截断字符串或二进制数据。语句已终止。”(个别)
解答:
因为在INSERT时,如果要插入的记录某列值所占字节数大于了建表时定义的属性列长度,则插入总是不成功的。若要插入,便会产生字符串或数据截断。一般会终止。例如:表Students中定义Semail为CHAR(20)类型。而要插入的记录中Semail列的值为“xunzhi19831023@hotmail”,则将出现如上所述的错误(在SQL Server 2000中,每个字母占一个字节)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论