BZOJ 刷题记录 PART 1

作者 : Dolphin

原文地址:http://blog.csdn.net/qingdujun/article/details/27109035

一、实体完整性定义

[例1]将Student表中的Sno属性定义为码。

CREATE TABLE Student
(
   Sno CHAR(10) PRIMARY KEY,  /*在列定义主码*/
   Sname CHAR(20) NOT NULL,
   Sage SMALLINT
);

或者:

CREATE TABLE Student
(
   Sno CHAR(10),
   Sname CHAR(20) NOT NULL,
   Sage SMALLINT,
   PRIMARY KEY(Sno)  /*在表级定义主码*/
);

[例2]将SC表中的Sno,Cno属性组定义为码。

CREATE TABLE SC
(
   Sno CHAR(10) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY(Sno,Cno)  /*只能在表级定义主码*/
);

二、参照完整性

[例3]定义SC中的参照完整性

CREATE TABLE SC
(
   Sno CHAR(10) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY(Sno,Cno),  /*只能在表级定义主码*/
   FOREIGN KEY(Sno) REFERENCES Student(Sno),  /*在表级定义参照完整性*/
   FOREIGN KEY(Cno) REFERENCES Course(Cno)    /*在表级定义参照完整性*/
);

[例4]显示说明参照完整性的违约处理示例。

CREATE TABLE SC
(
   Sno CHAR(10) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT,
   PRIMARY KEY(Sno,Cno),  /*只能在表级定义主码*/
   FOREIGN KEY(Sno) REFERENCES Student(Sno)  /*在表级定义参照完整性*/
     ON DELETE CASECADE   /*当删除时,级联*/
     ON UPDATE CASECADE,  /*当更新时,级联*/
   FOREIGN KEY(Cno) REFERENCES Course(Cno)   /*在表级定义参照完整性*/
     ON DELETE NO ACTION  /*当删除时,拒绝*/
     ON UPDATE CASECADE   /*当更新时,级联*/
);

三、用户定义完整性

[例5]在定义SC表时,说明Sno,Cno,Grade属性不允许取空值。

CREATE TABLE SC
(
   Sno CHAR(10) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT NOT NULL,
   PRIMARY KEY(Sno,Cno)  /*只能在表级定义主码*/
   /*如果定义了试题完整性,即主键,则隐含Sno,Cno不能取空*/
);

[例6]建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。

CREATE TABLE DEPT
(
   Deptno NUMERIC(2),
   Dname  CHAR(9) UNIQUE,   /*要求Dname列值唯一*/
   Location CHAR(10),
   PRIMARY KEY(Deptno)      /*在表级定义主码*/
);

[例7]Student表的Ssex只允许取"男"或"女"。

CREATE TABLE Student
(
   Sno CHAR(10) PRIMARY KEY,  /*在列定义主码*/
   Sname CHAR(20) NOT NULL,
   Ssex  CHAR(2) CHECK (Ssex IN ('男','女')),  /*性别属性Ssex只允许取'男'或'女'*/
   Sage SMALLINT
);

[例7]SC表的Grade的值应该在0和100之间。

CREATE TABLE SC
(
   Sno CHAR(10) NOT NULL,
   Cno CHAR(4) NOT NULL,
   Grade SMALLINT CHECK(Grade >= 0 AND Grade <= 100),
   PRIMARY KEY(Sno,Cno)  /*只能在表级定义主码*/
   /*如果定义了试题完整性,即主键,则隐含Sno,Cno不能取空*/
   FOREIGN KEY(Sno) REFERENCES Student(Sno),
   FOREIGN KEY(Cno) ENFERENCES Course(Cno)
);

[例9]当学生性别是男时,其名字不能以Ms.打头。

CREATE TABLE Student
(
   Sno CHAR(10) PRIMARY KEY,  /*在列定义主码*/
   Sname CHAR(20) NOT NULL,
   Sage SMALLINT,
   Ssex CHAR(2),
   CHECK(Ssex='女' OR Sname NOT LIKE 'Ms.%')
   /*定义了元组中Sname和Ssex两个属性值之间的约束条件*/
);

四、完整性约束命名子句

[例10]建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是"男"或"女"。

CREATE TABLE Student
(
   Sno NUMERIC(6)
      CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),
   Sname CHAR(20)
      CONSTRAINT C2 NOT NULL,
   Sage NUMERIC(3)
      CONSTRAINT C3 CHECK(Sage < 30),
   Ssex CHAR(2)
      CONSTRAINT C4 CHECK(Ssex IN('男','女')),
   CONSTRINT StudentKey PRIMARY KEY(Sno)
);

[例12]去掉[例10]中Student表中对性别的限制。

ALTER TABLE Student
  DROP CONSTRAINT C4;

[例13]修改表Student中的约束条件,要求学号改为在1000~9999之间。

ALTER TABLE Student
  DROP CONSTRAINT C1;
ALTER TABLE Student
  ADD CONSTRAINT C1 CHECK(Sno BETWEEN 1000 AND 9999);

参考文献:王珊,萨师煊.数据库系统概论(第4版) [M].北京:高等教育出版社,2006.152-160.

BZOJ 刷题记录 PART 1

时间: 2024-10-22 08:19:22

BZOJ 刷题记录 PART 1的相关文章

BZOJ 刷题记录 PART 4

[BZOJ1143]CTSC的题目...先用floyed传递闭包,然后直接上匈牙利算法. [BZOJ1452]从未写过的二维树状数组.好像很简单.. struct two_bit { int f[305][305]; inline void add(int x,int z,int A) { for (;x<=n;x+=L(x)) for (int y=z;y<=m;y+=L(y)) f[x][y]+=A; } inline int ask(int x,int z) { int ans=0; f

BZOJ 刷题记录 PART 5

拖了好久才写的. [BZOJ2821]接触分块大法.这道题略有点新颖.首先我们先分块,然后统计每块中每个数出现的个数. 下面是联立各个方块,预处理出第I个方块到第J个方块出现正偶数次数的个数. for (i=1;i<=s;i++) { for (j=i;j<=s;j++) { sum[i][j]=sum[i][j-1]; for (k=a[j].l;k<=a[j].r;k++) { temp[data[k]]++; if (!(temp[data[k]]&1)) sum[i][j

BZOJ 刷题记录 PART 2

[前言]最近感觉状态不错.做题几乎不看题解了.(一群大牛(FZ&WCY)在旁边喷:你刷水题有意思!)但是至少这也是一种进步吧.特别是权限题中有很多思维题. [BZOJ1055]就是一个简单的区间DP.重要代码: for (l=2;l<=L;l++) for (i=1;i<=L-l+1;i++) { j=i+l-1; for (k=0;k<4;k++) for (cut=i;cut<j;cut++) for (p=0;p<4;p++) if (f[i][cut][p])

BZOJ 刷题记录 PART 3

[前言]还是强调要少看题解. [BZOJ1090]简单的区间DP.值得注意的是:在压缩的时候,如果是10个A压缩,那么化成(10)A后有5个字符而不是4个!(我在这里被坑了好长时间!)以下是核心代码: for (len=2;len<=L;len++) for (i=1;i<=L-len+1;i++) { j=i+len-1; for (k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); for (l=1;l<=len/2;l++

BZOJ 刷题记录 PART 6

[BZOJ2709]水的二分加验证.可是好像被读入萎到了... [BZOJ3229]强大的算法见此.被机房的一堆大神"推荐".于是被坑了...写了一个下午... [BZOJ3631]这道题给我的启发是:要多想想算法. 開始一直在打树链剖分,打到一半忽然在众神犇的提(bi)示(shi)下.发现有O(N)的方法.试想:假设要支持区间改动(加减),最后再查询,能够用什么方法?固然,线段树和树状数组等等都能够,可是最好的显然是类似于前缀和的思想.比方在L~R加上一个数,能够再L处+K.在R+1

[2015.6.28] OI刷题记录

FZSZOJ刷题记录: 1051 砝码称重: DP 多重背包 1058 liqeuer: 序列DP 1061 挖地雷:DP,注意需要倒过来做DP,同时记录路径. 1059 Number:DP 1054 数塔问题:同数字三角形,普通DP 1390 等式问题:爆搜,枚举每个+号或-号的位置 1006 中位数:维护大根堆+小根堆,每次插入调整 1005 Cube Stacking:并查集维护当前在第几个和当前集合的高度,并查集变种. 1073 DNA分子的最佳比对:序列DP 1110 奖学金:傻逼题,

首师大附中科创教育平台 我的刷题记录(3)

首师大附中科创教育平台我的刷题记录(给大家刷11--15题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> #include<math.h> using namespace std; int main() { int x,y; cin>>x; y=abs(x+2); cout<<x*x-y+5<<endl; return 0; } 绝对值函数 #include

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

首师大附中科创教育平台 我的刷题记录(7)

首师大附中科创教育平台我的刷题记录(这次给大家刷多一点,31--40题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> using namespace std; int main() { int n; cin>>n; if(n%4==0&&n%100!=0||n%400==0) cout<<"yes"<<endl; else cout&