这一篇博客主要讲键的创建,约束的创建。修改对象和删除对象。

主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为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入门经典(五) 之键和约束的更多相关文章

  1. SQL入门经典(十) 之事务

    事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...

  2. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...

  3. SQL入门经典(四)之创建和修改数据表

    本章主要讲如何使用脚本创建数据库:如何使用脚本创建表:如何删除对象和修改对象. CREATE 语句:CREATE <object type> <onject name> 创建数 ...

  4. SQL入门经典(二) 之数据库基本查询、添加、更新和删除

    使用SQL查询: SQL查询基本语法: SELECT [ALL|DISTINCT]  [TOP (<expression>) [PERCENT] [WITH TIES] ] <col ...

  5. SQL入门经典(一)之简介

    今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...

  6. sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎

    一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...

  7. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第一,二,三,,四,五章)

    SQL - Structured  Query Language (结构化查询语言) 1/ SQL 命令的类型 : 数据定义语言: DDL 数据操作语言: DML 数据查询语言: DQL 数据控制语言 ...

  8. sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整

    第十六章: 利用索引改善性能 1. create index 单字段索引:  create index index_name on table_name (column_name);唯一索引:     ...

  9. sql 入门经典(第五版) Ryan Stephens 学习笔记  第四部分:建立复杂的数据库查询/

    第十三章: 在查询表里结合表 1.等值结合 : // 选择 tabla_a 和table_b 中id相等的行,输出 他们的id 和name select table_a.id , table_a.na ...

随机推荐

  1. centos查看系统cpu个数、核心书、线程数

    1.查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 2.查看核心数量 grep 'core id' /proc/cpuinfo ...

  2. Ajax用法总结

    ajax:      AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.      AJAX ...

  3. JavaScript数组删除重复元素(去重)的方法

    1. var arr=str.split(""); ;arr.length->i;i++){ ;j<arr.length;j++){ if(arr[j]==arr[i] ...

  4. H5学习系列之Geolocation API

    获取位置信息途径: 1.IP地址地理定位数据 2.GPS地理定位数据 3.WI-FI地理定位数据 4.手机地理定位数据 无废话直接上重点:navigator.geolocation对象就是获取地理位置 ...

  5. Ceph剖析:消息处理

    作者:吴香伟 发表于 2014/10/9 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 总体上,Ceph的消息处理框架是发布者订阅者的设计结构.Messenge ...

  6. qweb

    qweb 是 odoo的模板系统, 在 odoo系统中, 它有不同的用途和实现, 一个是 web client 的 widget 的渲染引擎, 它是通过 javascript实现的,也是 最早引入到 ...

  7. 20145202、20145225、20145234 《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验

    实验内容 1.配置环境 2.使用vi 编辑器阅读理解源码 2.编译应用程序 运行 make 产生可执行文件httpd 3.下载调试 使用 NFS 服务方式将HTTPD 下载到开发板上,并拷贝测试用的网 ...

  8. sql server 2000数据库 最近经常出现某进程一直占用资源,阻塞?死锁?

    OA的数据库最近多次出现某进程一直占用资源,导致其他进程无法执行.使用sp_who2 和 sql server profiler跟踪查询,发现有以下几个语句常常占用资源: 1.declare @P1 ...

  9. STL库的内存配置器(allocator)

    正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这 ...

  10. nginx搭建笔记

    1. nginx安装 Env: Mac OS 10.10 Yosemite pcre: http://pcre.org/ $tar -zxf pcre-8.34.tar.gz $cd pcre-8.3 ...