T-SQL查询和编程基础 (2)

1.3 创建表和定义数据完整性

注意:表是属于架构,而架构又是属于数据库的

  1. -- Create a database called testdb
  2. IF DB_ID('testdb') IS NULL
  3. CREATE DATABASE testdb;
  4. GO
  5.  
  6. --BD_ID 函数接受一个数据库名称作为输入,返回它的内部数据库ID.如果输入名称指定的数据库不存在,这个函数返回NULL.
  7. --这是检查数据库是否存在的简单方法
  8. --CREATE DATABASE 语句,采用了默认的文件设置(例如:区域和初始大小)

例子中使用的架构是dbo,在每个数据库中都会自动创建这个架构.当用户没有将默认架构显式关联到其他架构时,就会将这个dbo作为默认架构.

1.3.1 创建表

  1. -- Create table Employees
  2. USE testdb;
  3.  
  4. IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL
  5. DROP TABLE dbo.Employees;
  6.  
  7. CREATE TABLE dbo.Employees
  8. (
  9. empid INT NOT NULL,
  10. firstname VARCHAR(30) NOT NULL,
  11. lastname VARCHAR(30) NOT NULL,
  12. hiredate DATE NOT NULL,
  13. mgrid INT NULL,
  14. ssn VARCHAR(20) NOT NULL,
  15. salary MONEY NOT NULL
  16. );

解释:

a.use语句将当前的数据库上下文切换为testdb.use语句,确保要在正确的数据库中创建对象

b.OBJECT_ID函数用来检查在当前数据库是否存在表,OBJECT_ID函数接受一个对象名称和类型作为它的输入,这里类型"U"代表用户表

c.CREATE TABLE语句负责定义前面提到的关系的主体.在这个语句中先指定表的名称,接着在圆括号中定义它的各个属性(列).显示定义null,或者not null.

1.3.2 定义数据完整性

主键约束(Primary key Constraints)

主键约束实施行的唯一约束,同时不允许约束属性取NULL值.每个表只能定义一个主键.

  1. -- Primary key
  2. ALTER TABLE dbo.Employees
  3. ADD CONSTRAINT PK_Employees
  4. PRIMARY KEY(empid);

**为了实施逻辑主键约束的唯一约束,SQL Server将在幕后创建一个唯一索引(Unique index).唯一索引是SQL Server为了实施唯一约束而采用的一种物理机制.

可以用索引(不一定是唯一索引)来加速查询的处理,避免对整个表进行不必要的扫描.

唯一约束(Unique Constraints)

唯一约束用来保证数据行的一个列(或一组列)数据的唯一,可以在数据库中实现关系模型的替换键(alternate key)的概念.

再同一个表中可以定义多个唯一约束,唯一约束也不限于只定义在NOT NULL列上.

**和主键约束一样,SQL Server也在幕后创建一个唯一索引,作为实施逻辑唯一约束的物理机制

  1. -- Unique
  2. ALTER TABLE dbo.Employees
  3. ADD CONSTRAINT UNQ_Employees_ssn
  4. UNIQUE(ssn);

外键约束(Foreign Key)

外键约束用于实施引用完整性.这种约束在引用表(referencing table)的一组属性上进行定义,并指向被引用表(referenced table)中的一组候选键(主键或唯一约束).

外键的目的是为了将外键列允许的值域限制为被引用列中现有的值.

  1. -- Foreign key
  2. --
  3. --创建表dbo.Orders,并定义主键OrderID
  4. IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL
  5. DROP TABLE dbo.Orders;
  6.  
  7. CREATE TABLE dbo.Orders
  8. (
  9. orderid INT NOT NULL,
  10. empid INT NOT NULL,
  11. custid VARCHAR(10) NOT NULL,
  12. orderts DATETIME NOT NULL,
  13. qty INT NOT NULL,
  14. CONSTRAINT PK_Orders
  15. PRIMARY KEY(OrderID)
  16. );
  17.  
  18. --表dbo.Orders中的外键约束,指向表dbo.Employeesempid列,主键列
  19. ALTER TABLE dbo.Orders
  20. ADD CONSTRAINT FK_Orders_Employees
  21. FOREIGN KEY(empid)
  22. REFERENCES dbo.Employees(empid);
  23.  
  24. --同一表中的外键,修改表dbo.Employees,定义外键约束mgrid,指向表Employees中的empid列,主键列
  25. ALTER TABLE dbo.Employees
  26. ADD CONSTRAINT FK_Employees_Employees
  27. FOREIGN KEY(mgrid)
  28. REFERENCES Employees(empid);

注:即使被引用的候选键列不存在NULL值,在外键列中也允许NULL值

**外键的引用操作:禁止操作(默认的),级联操作

禁止操作:当试图删除被引用表中的行,或更新被引用的候选键时,如果在引用表中存在相关的行则此操作不能执行,RDBMS将拒绝执行这样的操作,并生成报错的信息.

级联操作:当在引用表中存在相关的数据行时,可以删除被引用表中的数据行货更新被引用候选键属性.可以在外键定义中将ON DELETE和ON UPDATE选项定义为CASCADE,SET DEFAULT和

SET NULL之类的操作.

*CASCADE:操作(删除或更新)将被级联到引用表中相关的行.

例如:ON DELETE CASCADE意味着当从被引用表中删除一行时,RDBMS也将从引用表中删除相关的行.

*SET DEFAULT和SET NULL意味着补偿操作会把相关行的外键属性分别设置为列的默认值或NULL值.注意:不论选择哪种操作,如果遇到了前面提及的NULL值异常,引用表将只有孤立的数据行.

检查约束(Check)

检查约束用于定义在表中输入或修改一行数据之前必须满足的一个谓词.

  1. -- Check
  2. ALTER TABLE dbo.Employees
  3. ADD CONSTRAINT CHK_Employees_salary
  4. CHECK(salary > 0);

注:如上,当谓词计算为false,会拒绝操作;当为true或unknown时,会接受操作.

默认约束(Default)

当插入一行数据时,如果没有为属性显示指定明确的值,就可以用一个表达式作为其默认值.

  1. -- Default
  2. ALTER TABLE dbo.Orders
  3. ADD CONSTRAINT DFT_Orders_orderts
  4. DEFAULT(CURRENT_TIMESTAMP) FOR orderts;

**CURRENT_TIMESTAMP函数,由它返回当前的日期和时间值!

练习

  1. /* 检查数据库是否存在,如果存在,删除此数据库 */
  2. /* select * from sysdatabases where name='bankDB' 检查是否有bankDB的数据库*/
  3.  
  4. if exists(select * from sysdatabases where name='bankDB')
  5. drop database bankDB
  6. go
  7. /*创建数据库bankDB*/
  8. create database bankDB
  9. on
  10. (
  11. name='bankDB_data',
  12. filename='d:\bank\bankDB.mdf',
  13. size=10,
  14. filegrowth=15%
  15. )
  16. log on
  17. (
  18. name='bankDB_log',
  19. filename='d:\bank\bankDB_log.ldf',
  20. size=5,
  21. filegrowth=15%
  22. )
  23.  
  24. /* 创建表*/
  25.  
  26. use bankDB
  27. go
  28. create table userInfo --用户信息表
  29. (
  30. customerID int identity(1,1),
  31. customerName char(8) not null,
  32. PID char(18) not null,
  33. telephone char(13) not null,
  34. address varchar(50)
  35. )
  36.  
  37. go
  38.  
  39. create table cardInfo --银行卡信息表
  40. (
  41. cardID char(19) not null,
  42. curType char(5) not null,
  43. savingType char(8) not null,
  44. openDate datetime not null,
  45. openMoney money not null,
  46. balance money not null,
  47. pass char(6) not null,
  48. IsReportLoss bit not null,
  49. customerID int not null
  50. )
  51. go
  52.  
  53. create table transInfo --交易信息表
  54. (
  55. transDate datetime not null,
  56. transType char(4) not null,
  57. cardID char(19) not null,
  58. transMoney money not null,
  59. remark text
  60. )
  61. go
  62.  
  63. /* 为userInfo表添加约束
  64. customerID(顾客编号): 自动编号(标识列),从1开始,主键
  65. PID(身份证号): 只能是18位或15位,身份证号唯一约束
  66. telephone(联系电话): 格式为xxxx-xxxxxxxx或手机号13位
  67. */
  68.  
  69. alter table userInfo
  70. add
  71. constraint pk_customerID primary key(customerID),
  72. constraint chk_PID check(len(PID)=18 or len(PID)=15),
  73. constraint uq_PID unique(PID),
  74. constraint chk_telephone check(telephone like '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  75. or len(telephone)=13)
  76. go
  77.  
  78. /* cardInfo 表的约束
  79. cardID 卡号 必填,主健,银行的卡号规则和电话号码一样,一般前8位代表特殊含义,
  80. 如某总行某支行等。假定该行要求其营业厅的卡号格式为:1010 3576 xxxx xxx开始,每4位号码后有空格,
  81. 卡号一般是随机产生。
  82. curType 货币种类 必填,默认为RMB
  83. savingType 存款类型 活期/定活两便/定期
  84. openDate 开户日期 必填,默认为系统当前日期
  85. openMoney 开户金额 必填,不低于1元
  86. balance 余额 必填,不低于1元,否则将销户
  87. pass 密码 必填,6位数字,开户时默认为6个“8”
  88. IsReportLoss 是否挂失 必填,是/否值,默认为”否”
  89. customerID 顾客编号 外键,必填,表示该卡对应的顾客编号,一位顾客允许办理多张卡号
  90. */
  91.  
  92. alter table cardInfo
  93. add
  94. constraint pk_cardID primary key(cardID),
  95. constraint ck_cardID check(cardID like '1010 3576 [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]'),
  96. constraint df_curType default 'RMB' for curType,
  97. constraint ck_savingType check(savingType in ('活期','定活两便','定期')),
  98. constraint df_openDate default getdate() for OpenDate,
  99. constraint ck_openMoney check(openMoney>=1),
  100. constraint ck_balance check(balance>=1),
  101. constraint ck_pass check(pass like '[0-9][0-9][0-9][0-9][0-9][0-9]'),
  102. constraint df_pass default '' for pass,
  103. constraint df_IsReportLoss default 0 for IsReportLoss,
  104. constraint fk_customerID foreign key(customerID) references userInfo(customerID)
  105. go
  106.  
  107. /* transInfo表的约束
  108. transDate 交易日期 必填,默认为系统当前日期
  109. cardID 卡号 必填,外健,可重复索引
  110. transType 交易类型 必填,只能是存入/支取
  111. transMoney 交易金额 必填,大于0
  112. remark 备注 可选输入,其他说明
  113. */
  114.  
  115. alter table transInfo
  116. add
  117. constraint df_transDate default getdate() for transDate,
  118. constraint ck_transType check(transType in ('存入','支取')),
  119. constraint fk_cardid foreign key(cardid) references cardInfo(cardID),
  120. constraint ck_transMoney check(transMoney>0)

第一章 T-SQL查询和编程基础 T-SQL语言基础(2)的更多相关文章

  1. SQL查询和编程基础

    本文转自http://www.cnblogs.com/Jolinson/p/3552786.html 这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基 ...

  2. Java程序设计(2021春)——第一章课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 第一章选择题 1.1 Java与面向对象程 ...

  3. oracle学习 第一章 简单的查询语句 ——03

    1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示全部的列.它与在select 之后列出全部的列名是一样的.查询语句以分号( ...

  4. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

  5. 20165310 学习基础和C语言基础调查

    学习基础和C语言基础调查 做中学体会 阅读做中学之后,了解老师关于五笔练习.减肥.乒乓和背单词的经历,不禁联想到自己学古筝的经历. 成功的经验 兴趣 我其实小时候学过一段时间古筝,但是那时候是因为父母 ...

  6. 20165234 预备作业2 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.技能学习经验及体会 你有什么技能比大多人(超过90%以上)更好? 看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好. 我从小喜欢五 ...

  7. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

  8. 20165230 学习基础和C语言基础调查

    20165230 学习基础和C语言基础调查 技能学习经验 我擅长弹钢琴.小时候我曾上过很多兴趣班,比如钢琴.跳舞.书法.绘画等等,唯一坚持至今的只有钢琴.仔细一算学习钢琴至今已有12年,不能说已经精通 ...

  9. 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.一种比大多数人(超过90%以上)更好的技能 说句实话,我还没有那种特别特别自信的.说我能拿得出手的.所谓能超过百分之九十以上的人的技能.毕竟人外有人,天外有天. 姑且算上 ...

  10. 20165235 学习基础和C语言基础调查

    20165235 学习基础和C语言基础调查 首先第一个问题:你有什么技能比大多人(超过90%以上)更好?感觉很难回答这种问题,其实我对很多东西挺感兴趣的,如果非要拿出一种比较突出的技能的话我感觉就是象 ...

随机推荐

  1. spiderkeeper使用教程

    安装包 pip install scrapy pip install scrapyd pip install scrapyd-client pip install spiderkeeper 进入到sc ...

  2. dpkg -l 命令返回数值

    ubuntu命令: dpkg -l 每条记录对应一个软件包,每条记录的第一,二,三个字符是软件包的状态标识,后边依此时软件包名称,版本号,和简述:   第一个字符为,期望值:包括如下状态: u 状态未 ...

  3. What happens in an async method

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-pr ...

  4. Collapse 折叠面板

    通过折叠面板收纳内容区域 基础用法 可同时展开多个面板,面板之间不影响 <el-collapse v-model="activeNames" @change="ha ...

  5. phpStudy本地搭建wordpress教程

    一.启用phpStudy环境包 phpStudy简单易用,一键启动配置本地环境; 二.wordpress博客程序 登陆wordpress官网下载最新程序,解压后提取wordpress目录下全部文件到p ...

  6. TextureMerger使用教程

    https://bbs.egret.com/thread-1653-1-1.html TextureMerger使用教程 2014-10-28 15:53 1862932 本帖最后由 E-Tool君 ...

  7. EUREKA 删除 or 强制下线/上线 实例

    开发环境,EUREKA 注册中心 某服务被注册了多个实例,feign 调用时 服务请求到其他实例上,请求收不到,使用一下命令删除 或者强制下线实例: 1 .DELETE  删除注册实例,但是如果被删除 ...

  8. 使用Navicat为Oracle导入函数后函数显示红叉

    上图是plsql中的截图 有可能是Navicat没有缓存过程,刷新试一试,不行的话,对导入的函数进行重新编译即可. 还发现一个问题是,Navicat导出的脚本里面,函数部分竟然没有参数和返回值,让我很 ...

  9. 使用Nginx压缩文件、设置反向代理缓存提高响应速度

    Gzip压缩: 最开始,这个竟然要6m多(大到不寻常),响应的速度3分多钟. 所以先对返回的文件进行gzip压缩.判断返回的资源是否有使用gzip压缩,观察响应头部里面,如果没有 Content-En ...

  10. Android测试之查看package和activity名称的方法

    方法一:使用aapt    //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下 1.命令行中切换到aapt.exe目录执行:aapt dump badging + 路径  ...