本人初学数据库,遇到两道关于SQL的题,请高手指点下,谢谢。
1、采购定单表中的付款方式是信用卡,约束要求只能是牡丹卡、金穗卡、龙卡、或者阳光卡,如何编写约束表达式?2、假设Students表中有主键Scode列,Score表中有外...
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 ('牡丹卡','金穗卡','龙卡','阳光卡')) 展开
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 ('牡丹卡','金穗卡','龙卡','阳光卡')) 展开
5个回答
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
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'
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.添加检查约束
alter table <表名> add constraint< 约束名> check (<字段名> in('牡丹卡' , '金穗卡', '龙卡' ,'阳光卡'))
不知道你表里的字段名是信用卡还是付款方式。
2.c
可能会更新Students表中的一行数据或更新失败
可能会更新Score表中的一行数据
alter table <表名> add constraint< 约束名> check (<字段名> in('牡丹卡' , '金穗卡', '龙卡' ,'阳光卡'))
不知道你表里的字段名是信用卡还是付款方式。
2.c
可能会更新Students表中的一行数据或更新失败
可能会更新Score表中的一行数据
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. select * from 采购订单 where 信用卡 in (牡丹卡、金穗卡、龙卡、阳光卡);
2. 选择 D 当SID引用Scode列且有数值联系时 更新Students表的Scode列 一定失败
当SID引用Scode列且没有数值联系时 更新Students表的Scode列 一定会被更新
2. 选择 D 当SID引用Scode列且有数值联系时 更新Students表的Scode列 一定失败
当SID引用Scode列且没有数值联系时 更新Students表的Scode列 一定会被更新
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
约束条件 信用卡 in(牡丹卡、金穗卡、龙卡、阳光卡)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 只要加上条件 信用卡 in (牡丹卡、金穗卡、龙卡、阳光卡)
2 应该是 A
2 应该是 A
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询