SQL入门经典(五) 之键和约束
这一篇博客主要讲键的创建,约束的创建。修改对象和删除对象。
主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为NULL)。由于主键在关系中数据库的重要性,因此它是所有键和约束中最重要的。一个表最多可以有一个主键。很少不需要主键的表。主键声明具有唯一性。常用有identity自动增长值和GUID。主键是唯一标识值。如果客户操作一个没有主键的表。连续添加2次一样数据。你怎么删除。删除总是2条一条删除。我们接着上篇博客。
下面创建一个主键表:

USE panda
GO --转为panda数据库操作 CREATE TABLE test002
(
ID int identity(1,1) primary key,--创建主键
name nvarchar(20) not null,
age int default(0) check(age>=0) --创建了默认值和Check约束
)

表结构查询,执行exec sp_helpconstraint test002,查询到3条。PK__test002__7C8480AE是这个表主键。
我们删除这条主键在重新创建主键:

ALTER TABLE test002
drop CONSTRAINT PK__test002__7C8480AE--PK__test002__7C8480AE这个数据库默认生成的。我们删除她,用脚本创建
GO--告诉数据库执行前面语句 ALTER TABLE test002
ADD CONSTRAINT PK_test002_ID
PRIMARY KEY(ID) --创建主键 GO exec sp_helpconstraint test002 --- 结果还是3条。主键名称已经改成了PK_test002_ID

先对来说比较简单。
外键:外键能确保数据完整性,也能表现表之间的关系,如果添加外键到一个表,就是在你定义外键表(引用表)和外键引用的表(被引用表)之间创建依赖关系。添加外键之后,插入引用表数据要么必须与被引用表引用列数据匹配某条记录。
试一试:创建一个带有外键表。我们在panda数据创建一个test003的表

CREATE TABLE test003
(
ID int identity(1,1) primary key,
test002ID int foreign key references test002(ID),--创建外键
OrderDate datetime default(getdate()),
name nvarchar(20) not null
)
GO
exec sp_helpconstraint test003 --查询到系统默认生成FK__test003__test002__023D5A04名称外键

外键约束可以在表中建立0-253个。主键约束只能一个,外键约束可以多个。每列只能引用外键值。和主键创建方式差不多。删除差不多。试一试使用脚本创建外键:我先删除上面那个表外键

ALTER TABLE test003
drop CONSTRAINT FK__test003__test002__023D5A04.--删除外键
GO
ALTER TABLE test003
ADD CONSTRAINT FK_T003_T002_ID
FOREIGN KEY (test002ID) REFERENCES test002(ID)--创建外键,引用test002的ID外键 go exec sp_helpconstraint test003--外键信息已经更新到 FK_T003_T002_ID

是不是看起来很简单;外键可选级联操作。外键是双向,不仅限制子表值存在,也限制父表中。每次对父表删除时候先检查一次子表是否有数据(防止子表孤立数据).

CREATE TABLE test003
(
ID int identity(1,1) primary key,
test002ID int foreign key references test002(ID)
ON UPDATE NOT ACTION
ON DELETE CASCADE,
,--创建外键
OrderDate datetime default(getdate()),
name nvarchar(20) not null
)---下面一一介绍。外键ON后面可以跟4个参数。SET NULL,SET DEFAULT,NOT ACTION ,CASCADE

NOT ACTION:执行删除和更新操作时候会总拒绝执行,因为子集数据无法得到更新,防止数据孤立和完整性。所以被引用表被执行时候就被拒绝执行
CASCADE:删除和更新会更新子集数据。删除被引用表数据会传播到引用表数据;为了数据完整性和不使数据孤立,连子表数据一起更新和删除操作。
SET DEFAULT和SET NULL:如果被引用表被删除。引用表外键数据会设置一个默认值或者NULL。
UNIQUE唯一约束:这些约束相对来说比较简单。唯一约束可以做候选主键。和主键差不多。他们共同点要求表中指定列只有唯一指定值。唯一不同点。唯一约束没有看作表中唯一标识符。一个表可以有多个唯一约束,主键只有一个。如果插入2个一样的唯一约束值,sql会拒绝执行。试一试:

ALTER TABLE test002
add
email nvarchar(50) not null
unique ,--创建唯一约束
phone nvarchar(12) not null GO ALTER TABLE test002
add constraint UK_test002_phone
UNIQUE(phone) --给phone字段创建唯一约束 exec sp_helpconstraint test002--你会发现多了2个唯一约束。

CHECK约束:check约束较好她不限于一个特殊的列。CHECK约束可以跟一个列关联,但是也可以跟一个表关联,可以使用更where字句来规则定义CHECK约束。
限制月份 CHECK(BETWEEN 1 AND 12),正确的手机号码([1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])等等.
如何在表中加CHECK约束。test002建表age有check>0约束。我们给test003表中的OrderDate创建一个日期不能小于当前日期的约束
ALTER TABLE test003
ADD CONSTRAINT CK_TEST003_DATE
CHECK(OrderDate>=getdate())
DEFAULT约束:和所有约束一样,比较让人混淆。DEFAULT只能INSERT添加语句使用。如果没有提供值就会默认值。如果提供该列值不会使用默认值。
如何在表中加default约束。test002建表OrderDate有default=getdate()约束。我们给test003表中的name添加一个“匿名用户”的默认值
ALTER TABLE test002
ADD CONSTRAINT D_test002_name
Default('匿名用户') for name
在创建约束忽略无效数据。因为已经输入很多数据,现在建立的CHECK约束不能作用到以前约束。WITH NOCHECK字段。
我们给test002数据添加约束

ALTER TABLE test002
add constraint CK_test002_phone
check(phone like '[1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')--抛出错误信息 消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 CHECK 约束"CK_test002_phone"冲突。该冲突发生于数据库"panda",表"dbo.test002",>column,phone因为数据已经存在不一样数据如解决呢?在add前面加上with nocheck就可以了 ALTER TABLE test002
WITH NOCHECK
add constraint CK_test002_phone
check(phone like '[1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')--命令已成功完成。

禁用临时的CHECK约束数据:

ALTER TABLE test002
NOCHECK
CONSTRAINT CK_test002_phone--就可以了。标志这个约束已经禁用 ALTER TABLE test002
CHECK
CONSTRAINT CK_test002_phone--重新启用这个约束。

规则和默认值:
规则创建: create rule <rule name> AS <expression>.
CREATE RULE Salary
AS @Salary>0; --创建规则
--查看规则:exec sp_helptext <rule name>;会显示文本信息
把规则绑定到数据列上语法: exec sp_bindrule '<rule name>','< object name>','<futureonly _flag>'. 如:exec sp_bindrule 'Salary','dbo.test002.age'.
移除绑定的规则:exec sp_unbindrule '< object name>' 如:exec sp_unbindrule 'dbo.test002.age'
删除规则 DROP RULE <object name>
默认值创建:CREATE DEFAULT <default name> AS DEFAULT(default value)。
CREATE DEFAULT SalaryDefault
AS 0;
绑定默认值:exec sp_bindefault '<rule name>','< object name>','<futureonly _flag>'.
移除绑定的默认值:exec sp_unbindefault '<obect name'>
删除默认值:DROP DEFAULT <default name>
确定那些列使用规则和默认值:exec sp_depends <object name>。
如何选择数据完整性决策:

SQL入门经典(五) 之键和约束的更多相关文章
- SQL入门经典(十) 之事务
事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...
- 《SQL入门经典》总结
<SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...
- SQL入门经典(四)之创建和修改数据表
本章主要讲如何使用脚本创建数据库:如何使用脚本创建表:如何删除对象和修改对象. CREATE 语句:CREATE <object type> <onject name> 创建数 ...
- SQL入门经典(二) 之数据库基本查询、添加、更新和删除
使用SQL查询: SQL查询基本语法: SELECT [ALL|DISTINCT] [TOP (<expression>) [PERCENT] [WITH TIES] ] <col ...
- SQL入门经典(一)之简介
今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎
一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第一,二,三,,四,五章)
SQL - Structured Query Language (结构化查询语言) 1/ SQL 命令的类型 : 数据定义语言: DDL 数据操作语言: DML 数据查询语言: DQL 数据控制语言 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整
第十六章: 利用索引改善性能 1. create index 单字段索引: create index index_name on table_name (column_name);唯一索引: ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 第四部分:建立复杂的数据库查询/
第十三章: 在查询表里结合表 1.等值结合 : // 选择 tabla_a 和table_b 中id相等的行,输出 他们的id 和name select table_a.id , table_a.na ...
随机推荐
- html5调取手机摄像头或相册
html5调用手机摄像头或者相册 由于input的type=file 格式的文件的界面并不是我们所希望的界面,所以在此我隐藏input,自定义样式,这个样式就在<a>中自己定义,这里我就不 ...
- 老男孩python自动化运维作业1
#!/usr/bin/env pthon #字典操作三级菜单 “b”返回上一级菜单,“q”退出. menu={"BJ":{"cp":{1:1,2:2,3:3}, ...
- Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- centos7引导项修复
每次装了双系统,都会发现原来的windows引导项不见了,这让我这个windows重度依赖者情何以堪,所以,必须要把我挚爱的windows给找回来. 翻看了一些网上的教程,看来这并不是一个困难的问题. ...
- JAVA可移植性广泛应用
一.JAVA作为一种编程语言:源代码可移植性 作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植.这意味着任意一个JAVA程序,不论它运行在何种CPU.操作系统或JAV ...
- Git远程操作
Git远程操作 // */ // ]]> Git远程操作 Table of Contents 1 Git远程命令概览 2 Git远程仓库与本地仓库的关系图 3 git clone 4 git ...
- EasyUI DataGrid getChecked/getSelections 获取不到数据
今天使用getChecked获取选择的行,结果总是获取一行数据,于是换用getSelections,结果还是一样,想起之前做的项目,把idField换了下,之后getChecked/getSelect ...
- 关于Linux的 /sbin权限问题
安装ubuntu一段时间后新增了用户,突然发现原来的用户用不了 ifconfig ,提示找不到命令 一试之下发现/sbin/ifconfig,可以,明白了是因为用户新增了,系统不认为当前用户是唯一用户 ...
- JS 关闭页面事件
主页面调用:<script src="<%=ResolveUrl("../JS/QuitJS.js") %>" type="text ...
- Java编程中“为了性能”尽量要做到的一些地方
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...