Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101938610
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938611
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938612
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938613
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938604
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938615
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938616
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938617
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938618
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938619
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938620
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938621
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938622
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938623
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938624
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938625
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938626
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938627
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938628
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938619
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938630
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938631
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938632
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938633
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938634
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938635
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938636
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938637
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938638
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938639
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938640
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938641
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938642
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938643
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938634
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938645
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938646
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938647
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938649
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938650
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938651
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938652
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938653
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938654
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938655
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938656
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938657
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938658
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938649
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938660
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938661
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks

DB2 9 数据库管理(731考试)认证指南,第 3 部分: 数据访问(4)-sdccf-ChinaUnix博客
  • 博客访问: 101938662
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:17:08

developerWorks



在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26392) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26391) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26388) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26387) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26385) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26384) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26383) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26381) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26379) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26378) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26377) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26376) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26375) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26374) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26373) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26368) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26362) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26360) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26359) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26353) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26349) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


在表上定义数据约束

数据库中数据的完整性或有效性极其重要。确保插入数据库的数据的有效性非常困难,DB2 提供了定义某些可并入数据库的基于规则的约束或检查的能力。在 DB2 中,可使用以下检查来最小化将错误数据插入表中的风险:

  • 可检查一行中的一段,看它们是否符合所关联列的数据类型和长度。例如,“Geoff” 值不匹配数据类型为 INTEGER 的列,因而带有该值的行会被拒绝,以这种方式来确保数据库中数据的有效性。

  • 若表上定义了主键约束,表中的各行必须在一列或共同构成主键的多个列中具有惟一值。若插入的行中存在与现有键相同的键,则新行将被拒绝。

  • 若表上已定义了惟一约束,表中的各行必须遵循此约束,即具有惟一值或构成惟一键的值组合。

  • 若已定义了外键约束,表中各行的外键列或多个列必须具有与父表中一行的主键相匹配的值。在某些情况下,若一列或多个列定义为外键的一部分,而这个外键可为空,则空值也是可接受的。

  • 若列上已定义了检查约束,各行必须遵循此约束。例如,EMPLOYEE 表的 SALARY 列上的检查约束可能会阻止应用程序或用户插入工资低于 0 的新员工记录或行。插入表的任何 salary 值小于 0 的行都会被拒绝,从而最小化将错误数据插入表中的风险。

主键约束、惟一约束和外键约束均已在 创建和管理索引 中介绍过。本节主要探讨检查约束。







表检查约束将在表级强制实施数据完整性。为表定义了表检查约束之后,每条 UPDATEINSERT 语句都会检查限制或约束。若违背了约束,将不会插入或更新行,还会返回一个 SQL 错误。

表检查约束可在表创建时定义,也可随后使用 ALTER TABLE 语句定义。表检查约束有助于为表中包含的数据值实现特定规则,方法是指定表各行内一列或几列中允许的值。这能够节省应用程序开发人员的时间,因为各数据值的检验可由数据库来执行,而不必由每个访问数据库的应用程序执行。







向一个包含数据的表添加检查约束时,存在两种可能性:

  • 所有行都将满足检查约束。
  • 所有行中有一部分不满足检查约束。

在第一种情况下,也就是所有行都满足检查约束时,检查约束将成功创建。将来,若尝试插入或更新不匹配约束业务规则的数据,则尝试将被拒绝。

若有某些不符合检查约束的行,检查约束就不会创建(也就是说,ALTER TABLE 语句将失败)。

为前文提到的 EMPLOYEE 表(请参见 参照完整性和索引)添加新约束的 ALTER TABLE 语句如下所示。检查约束名为 check_jobINSERTUPDATE 语句失败时,DB2 将使用此名称来通知我们违反了约束。

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

没有特殊的命令可用于更改检查约束。若需更改检查约束,您必须首先删除原约束,再创建一个新的。检查约束可随时删除,这一行为不会影响到您的表或表中的数据。







在创建表时,您可向表添加一个约束。要为单独列添加约束,可在列定义后添加一个 CONSTRAINT/CHECK 子句:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

CONSTRAINT 名称并非定义的必要部分,但建议您为约束命名,以便此后修改。如果未为约束命名,就必须确定其系统定义的名称。

也可跨多个列定义约束,这些定义通常放置在所有列定义的末尾处。这些约束结合了列值,通常称为表约束。如下 SQL 语句就是一个表约束的示例,该约束检查个人的年龄和工资:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

CHECK 语句中不寻常的逻辑是必需的,原因在于约束的处理方式。对于要插入的记录来说,括号中的约束必须为 true。也就是说,语句 NOT(AGE < 30 AND SALARY > 60000) 必须为 true。该逻辑的解释就是任何人的年龄不得小于 30 岁、收入不得超过每年 60000。







至此,我们定义的所有约束都是在插入或更新记录时,由 DB2 强制实施的。这会导致大量的系统开销,特别是在载入的记录数量较多时。

如果一个应用程序在将记录插入到 DB2 中之前已验证了信息,那么使用信息约束 要比普通约束更有效。信息约束告诉 DB2 数据应采取的格式,而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用,并提高 SQL 查询的性能。考虑以下 CREATE TABLE 语句:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED,它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION,DB2 在对该表运行 SELECT 语句时使用它。指定该值时,DB2 将在优化 SQL 时使用约束中的信息。







若表包含 NOT ENFORCED 选项,INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时,不会产生任何错误:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

编号是 5 的员工的性别显然有问题(Q),编号 6 的员工不但性别有问题,同时工资也超出了 SALARY 列的限制。在这两种情况下,DB2 依然允许插入,因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。







在上一屏运行的插入之后,如果再对 EMPDATA 表执行 SELECT 语句,其结果很可能会令您更加迷惑:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 向查询返回了错误的答案。表中发现了 “Q” 值,但该列上的约束告诉 DB2 有效值仅包括 “M” 和 “F”。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为,那么您就需要使用 ALTER 命令来更改约束:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

现在,再重新执行之前的查询。结果如下所示:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

信息约束应该在什么时候用于 DB2 中?使用信息约束的最佳场景是用户能够保证该应用程序是惟一插入和更新数据的程序时。若应用程序已预先检查了所有的信息,那么使用信息约束可以带来更快的性能,不需重复操作。







在 DB2 中,有多种约束可维护数据完整性。这些约束包括数据类型、主键、惟一、外键和检查约束。

检查约束允许用户在列中的数据上设置规则,从而确保首先满足特定标准,然后才允许行插入。这些约束可加以修改,以便强制实施条件或忽略条件。同样,也可告知优化器使用约束中的信息进行优化,或者忽略这些信息。

合理利用检查约束有助于提高查询性能、最小化加载时间。但若没有恰当的数据清理,检索到的结果有时可能并不准确。

阅读(26347) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~