本人初学数据库,遇到两道关于SQL的题,请高手指点下,谢谢。

1、采购定单表中的付款方式是信用卡,约束要求只能是牡丹卡、金穗卡、龙卡、或者阳光卡,如何编写约束表达式?
2、假设Students表中有主键Scode列,Score表中有外键SID列,SID引用Scode列来实施引用完整性约束,此时如果使用T-SQL:
UPDATE Students SET Scode = '001201' WHERE Scode = '01201'
来更新Students表的Scode列,可能的运行结果是()
A 肯定会产生更新失败
B 可能会更新Students表中的两行数据
C 可能会更新Score表中的一行数据
D 可能会更新Students表中的一行数据
对于第1题,书中提供示例是:NOT (付款方式='信用卡') OR (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))
但是我觉得应该是:(付款方式='信用卡') AND (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))

第1个回答  2013-04-07
1、
ALTER TABLE 采购定单表
ADD CONSTRAINT chk_采购定单表_付款方式
CHECK ( 付款方式 IN ( '牡丹卡', '金穗卡', '龙卡', '阳光卡' ) );

如果书中提供示例是:
NOT (付款方式='信用卡') OR (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))

那么可以看出, 采购定单表 中有 “付款方式” 与 “信用卡” 这两列。

也就是 约束条件为
NOT (付款方式='信用卡')

意思是: 付款方式不是 信用卡。

OR (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))

意思就是: 付款方式是 信用卡的情况下, 信用卡需要是哪些 卡。

至于你觉得应该是:(付款方式='信用卡') AND (信用卡 IN ('牡丹卡','金穗卡','龙卡','阳光卡'))

那么这个 付款方式, 只能是 信用卡了, 你要支付现金的话, 没法处理了。

2、D
原因:
排除法分析。
假如 学生表的 Scode = '001201' 的数据, 在 Score 表里面 , 一行数据也没有。
那么更新是不会出错的。 因此 A 不正确。

Scode列是 主键, 因此, 不会更新2行数据, 因此 B 不正确。

如果 存在有 Scode = '001201' 的数据, 且 Score 表存在一行关联数据。

并且 这个外键是 UPDATE CASCADE 的情况下。
那么 更新 Students 表, 会同时更新 Score 表。
但是由于不知道是什么数据库。
因为 Oracle 和 DB2 , 好像是不支持 UPDATE CASCADE 的。
SQL Server, MySQL, SQLite , PostgreSQL 支持 UPDATE CASCADE 。
但是题目上面没有明确说明, 这个外键是 UPDATE CASCADE
因此这个 C 只能是 如果其他几个都错的情况下, 才选择 C.

如果 存在有 Scode = '001201' 的数据, 且 Score 表无数据,那么就会更新一行数据。
如果不存在 Scode = '001201' 的数据, 那么一行也不会更新。
因此, 可能会更新Students表中的一行数据。

也就是最后
如果题目是 单选的话, 就选D。
多选的话, 如果明确 不是 Oracle 或者 DB2 数据库的, 可以选择 C, D追问

我学得是SQL Sever
如果是ON UPDATE CASCADE,并且存在Scode = '01201',应该两个表都有一行更新吧?

追答

对的, 如果是 SQL Server 的话。

外键是 ON UPDATE CASCADE 的情况下。

那么
UPDATE Students SET Scode = '001201' WHERE Scode = '01201'

将同时把
Score 表的 Scode = '001201' 的数据, 也更新为 '01201'

追问

如果外键不是ON UPDATE CASCADE,或者不存在Scode = '01201',那么就会更新失败,是吗

追答

如果 Score 表 没有 Scode = '01201' 的数据。
那么 Students 表将正常更新, 不会失败啊。

如果 外键不是 ON UPDATE CASCADE 的, 并且 Score 表有 Scode = '01201' 的数据。
UPDATE Students SET Scode = '001201' WHERE Scode = '01201' 才会失败!

追问

我的意思是,如果Scode = ‘01201’不存在,那么WHERE不就匹配不到了吗,这样不会出错吗?
可以百度Hi一下我吗

追答

我现在要

UPDATE Students SET Scode = '001201' WHERE Scode = '01201'

更新 学号为 '001201' 的 学生的 数据。

这个学生从来没有参加过考试, 因此 Score 表 没有 Scode = '01201' 的数据。

那么我这个操作, 只修改 Students 表, 为什么要出错?

如果 Students 表, 连 Scode = '01201' 的数据也没有。
那么也就是这个学生都不存在。
那么语句执行成功, 但是会提示你, 更新了 0 行数据。

只有 Students 有一行 '001201' 的 学生的 数据。
这个学生, 又参加了一门考试。 那么 Score 表就会有一行 Scode = '01201' 的数据。
外键又是默认的外键, 不带 ON UPDATE CASCADE 的。

这个时候, 你尝试

UPDATE Students SET Scode = '001201' WHERE Scode = '01201'

数据库就会先检查。

发现
如果把学生表的 Scode = '01201' 的数据, 修改为 Scode = '001201'
那么会导致 Score 表 会有一行 Scode = '01201' 的 孤儿数据。

也就是 以后就不知道 这个 成绩, 是哪一个学生的成绩了。
那么就要抱错, 并提示你, 不允许修改。

第2个回答  2013-04-07
1.添加检查约束
alter table <表名> add constraint< 约束名> check (<字段名> in('牡丹卡' , '金穗卡', '龙卡' ,'阳光卡'))
不知道你表里的字段名是信用卡还是付款方式。
2.c
可能会更新Students表中的一行数据或更新失败

可能会更新Score表中的一行数据
第3个回答  2013-04-07
1. select * from 采购订单 where 信用卡 in (牡丹卡、金穗卡、龙卡、阳光卡);
2. 选择 D 当SID引用Scode列且有数值联系时 更新Students表的Scode列 一定失败
当SID引用Scode列且没有数值联系时 更新Students表的Scode列 一定会被更新
第4个回答  2013-04-07
约束条件 信用卡 in(牡丹卡、金穗卡、龙卡、阳光卡)
第5个回答  2013-04-07
1 只要加上条件 信用卡 in (牡丹卡、金穗卡、龙卡、阳光卡)
2 应该是 A

本人初学数据库,遇到两道关于SQL的题,请高手指点下,谢谢。
如果 存在有 Scode = '001201' 的数据, 且 Score 表存在一行关联数据。并且 这个外键是 UPDATE CASCADE 的情况下。那么 更新 Students 表, 会同时更新 Score 表。但是由于不知道是什么数据库。因为 Oracle 和 DB2 , 好像是不支持 UPDATE CASCADE 的。SQL Server, MySQL, SQLite , Post...

SQL查询语句排序问题,请高手指点
select * from (select yebk.fzdm4,left(yebk.fzdm5,1),fzxzl.fzmc,fzxzl.fzdm,sum(yebk.yj1)+sum(yebk.yj2)+sum(yebk.yj3)+sum(yebk.yj4)+sum(yebk.yj5)+sum(yebk.yj6)+sum(yebk.yj7)+sum(yebk.yj8)+sum(yebk.yj9)+sum(yebk.yj10)+sum(yebk.yj11)+sum(yebk....

spl数据库简单问题,请高手指点
1.可以通过 企业管理器->数据转换专程第三方,然后在专程2005就可以了.2.或是通过 企业管理器->工具->导入数据.3.也可以建立一个企业管理器->安全性-->点击连接服务器->右键新建一个一个连接指向你原来的那个数据形式就可以了.

天之炼狱 CS4 服务端 SQL 连接问题,请高手指点。
(1)mysql服务所在的硬件服务器未开机或不存在物理线路到硬件服务器,即ping不通。(2)用低版本的GUI工具去连接高版本的服务器,不同版本的底层使用的通信协议不一样造成。解决方案:1、在安装mysql的时候有两个选项允许远程访问mysql,重新设置下mysql,把允许远程访问的选项选上。2、防火墙里面要开放...

请高手指点,谢谢!是规律题吗
7+3=410 看规则,5+3=28是5+3=8,5-3=2,

...怎么查看具体出错的地方怎么查得,请高手指点,本人是菜鸟。
需要将一列varchar2类型的数字字符的字符串转化成number型。用to_number就会报错。现在只想到两种方法:1、修改表结构,增加多一列,把那列包含需要转化为number型的数据放进来;2、在SQL做功夫,分别对只包含数字字符的情况和只包含非数字字符的情况分开编程,简单时可以用子查询,复杂点就可以用两个...

几道数学逻辑推理题,我不会,请高手指点一下
1,剩下1020个。(不会算,程序跑出来的)。2,可以算相遇时间(这个是不是应该有北京上海的距离啊),然后乘苍鹰速度。3.能追上,猫应应该跑60步追上老鼠。猫每跑十步,老鼠能跑15步,如果猫追不上则老鼠要跑18步,所以猫能追上老鼠。猫跑了十步,相当与与老鼠的距离近了老鼠三步的距离,如果...

...=' 附近有语法错误。总是提示说update这行有错误,请高手指点...
sql="UPDATE [ccgcdiaodu].[dbo].[瓦斯抽采利用月报表] SET [矿井数]="&kjs&", [高突矿井数]=">kjs&", [应进行抽采矿井数]="&yjxcc&", [抽采矿井数]="&cckjs&" ,[高突矿井抽采数]=">cc&" ,[当月瓦斯抽采量]="&dycc&" ,[瓦斯抽采率]="&wslyl&" ,[当月瓦斯利用...

SQL执行时提示"("附近语法错误,请高手指点,谢谢!
错略的看没有错误,怀疑是全角符号和半角符号问题,注意()要使用半角的()。

...中提示 from 子句语法错误,代码如下,请高手指点 在线等。
from 表1 inner join 表2 on 表1.字段 = 表2.字段 where ………表一表二中需要有关联字段,用来关联两表。(表2.字段、表1.字段需要是关联字段)

相似回答