数据完整性(Data Integrity)笔记

因数据库存储数据要持之以恒,数据库中的表需要一些方法验证各种数据类型。不仅仅局限于数据类型,还有唯一值,值的范围,或者某列的值和另外一个表中的列匹配。

当你在定义表的时候其用这些数据验证方法。这叫做声明数据完整性。也就是我们说的表约束。

USE tempdb
GO
CREATE TABLE s
    (
      sid VARCHAR(20) ,
      sname VARCHAR(20) ,
      ssex VARCHAR(2) CHECK ( ssex = ‘男‘
                              OR ssex = ‘女‘ )
                      DEFAULT ‘男‘ ,
      sage INT CHECK ( sage BETWEEN 0 AND 100 ) ,
      sclass VARCHAR(20) UNIQUE ,
      CONSTRAINT PK_s PRIMARY KEY ( sid, sclass )
    )
CREATE TABLE t
    (
      teacher VARCHAR(20) PRIMARY KEY ,
      sid VARCHAR(20) NOT NULL ,
      sclass VARCHAR(20) NOT NULL ,
      num INT ,
      FOREIGN KEY ( sid, sclass ) REFERENCES s ( sid, sclass )
    )

主键约束 Primary Key Constraints

primary key = unique constraint + not null constraint

创建主键约束时,数据库自动创建唯一索引,默认为聚集索引

创建方法一

-- Primary Key Constraints
CREATE TABLE Production.Categories
(
  categoryid   INT           NOT NULL IDENTITY,
  categoryname NVARCHAR(15)  NOT NULL,
  description  NVARCHAR(200) NOT NULL,
  CONSTRAINT PK_Categories PRIMARY KEY(categoryid)
);

创建方法二

USE TSQL2012;
ALTER TABLE Production.Categories
    ADD CONSTRAINT PK_Categories PRIMARY KEY(categoryid);
GO

列出数据库中的主键约束

-- To list the primary key constraints in a database, you can query the sys.key_constraints table filtering on a type of PK:
SELECT *
FROM sys.key_constraints
WHERE type = ‘PK‘;

唯一性约束 Unique Constraints

仅可以有一行为NULL,ORACLE中可以有多行列值为NULL。

创建唯一键约束时,数据库自动创建唯一索引,默认为非聚集索引

在保证数据唯一性上,唯一索引、唯一约束并没有区别,那么应该使用约束还是索引?

约束定义通常出现在数据库逻辑结构设计阶段,即定义表结构时,索引定义通常出现在数据库物理结构设计/查询优化阶段。

从功能上来说唯一约束和唯一索引没有区别,但在数据库维护上则不太一样,对于唯一约束可以用唯一索引代替,以方便维护,但是主键约束则没法代替。

ALTER TABLE Production.Categories
    ADD CONSTRAINT UC_Categories UNIQUE (categoryname);
GO

列出数据库中的唯一约束

SELECT *
FROM sys.key_constraints
WHERE type = ‘UQ‘;

外键 Foreign Key Constraints

创建

ALTER TABLE Production.[Products]  WITH CHECK
    ADD  CONSTRAINT [FK_Products_Categories] FOREIGN KEY(categoryid)
    REFERENCES Production.Categories (categoryid)

查找外键

SELECT *
FROM sys.foreign_keys
WHERE name = ‘FK_Products_Categories‘;

删除外键

ALTER TABLE Production.Products DROP CONSTRAINT FK_Products_Categories;

检查约束 Check Constraints

创建

ALTER TABLE Production.Products WITH CHECK
ADD CONSTRAINT CHK_Products_unitprice
CHECK (unitprice>=0);
GO
ALTER TABLE dbo.NewTable
ADD ZipCode INT NULL
CONSTRAINT CHK_ZipCode
CHECK (ZipCode LIKE ‘[0-9][0-9][0-9][0-9][0-9]‘);

查找检查约束

SELECT *
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N‘Production.Products‘, N‘U‘);

默认约束 Default Constraints

创建

CREATE TABLE Production.Products
(
  productid    INT          NOT NULL IDENTITY,
  productname  NVARCHAR(40) NOT NULL,
  supplierid   INT          NOT NULL,
  categoryid   INT          NOT NULL,
  unitprice    MONEY        NOT NULL
    CONSTRAINT DFT_Products_unitprice DEFAULT(0),
  discontinued BIT          NOT NULL
    CONSTRAINT DFT_Products_discontinued DEFAULT(0),
);

查找

SELECT *
FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID(N‘Production.Products‘, ‘U‘);

启用和禁用约束检查

ALTER TABLE Products NOCHECK CONSTRAINT CHK_Price;
ALTER TABLE Products CHECK CONSTRAINT CHK_Price;

检查在SQL Server中的约束

--Easiest way to check for the existence of a constraint (and then do something such as drop it if it exists) is to use the OBJECT_ID() function...
IF OBJECT_ID(‘CK_ConstraintName‘, ‘C‘) IS NOT NULL
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
--OBJECT_ID can be used without the second parameter (‘C‘ for check constraints only) and that may also work, but if your constraint name matches the name of other objects in the database you may get unexpected results.
IF OBJECT_ID(‘CK_ConstraintName‘) IS NOT NULL
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName
--OBJECT_ID can also be used with other "constraints" such as Foreign Key constraints or Primary Key constraints, etc. For best results, always include the appropriate object type as the second parameter for the OBJECT_ID function:
--Constraint Object Types:
--•C = CHECK constraint
--•D = DEFAULT (constraint or stand-alone)
--•F = FOREIGN KEY constraint
--•PK = PRIMARY KEY constraint
--•R = Rule (old-style, stand-alone)
--•UQ = UNIQUE constraint

参考文章

09. 约束与索引的联系

时间: 2024-11-03 05:35:38

数据完整性(Data Integrity)笔记的相关文章

[svc]对称加密/非对称加密细枝末节-如何做到数据传输的authentication/data integrity/confidentiality(私密)

对称/非对称/混合加密的冷知识 数据在互联网上传输,要考虑安全性. 讲到安全,要从三方面考虑: 1.authentication 每一个IP包的认证,确保合法源的数据 2.data integrity 验证数据完整性,保证在传输过程中没有被人为改动 3.confidentiality (私密性)数据包的加密 下面谈谈如何对数据加密. 于是有了非对称加密 对称加密 对称加密算法---使用一把密匙来对信息提供安全的保护.只有一个密匙,即用来加密,也用来解密 特点: - 1.速度快 - 2.密文紧凑

[PostgreSQL] Use Foreign Keys to Ensure Data Integrity in Postgres

Every movie needs a director and every rented movie needs to exist in the store. How do we make sure something in another table exists before inserting new data? This lesson will teach us about foreign keys and references. CREATE TABLE directors ( id

Spring Data学习笔记-查询方法

Spring Data支持类似Hibernate的查询语句,也可以写原生SQL语句,下面记录典型的例子. /**  * 1. Repository 是一个空接口. 即是一个标记接口  * 2. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean.  * 纳入到 IOC 容器中. 进而可以在该接口中定义满足一定规范的方法.   *   * 3. 实际上, 也可以通过 @RepositoryDefinition 注解来替代继承 Rep

How to ensure data integrity during transmission

XMODEM. It's old, it's bad, but it is widely supported both in hardware and in software, with libraries available for literally every language and market niche. HDLC - High-Level Data Link Control. It's the protocol which has fathered lots of reliabl

JQuery中attr属性和jQuery.data()学习笔记

用html直接data-key来存放,key必须全部小写. <div data-mydata="123"></div> consoloe.log($("div").data("mydata")); //output 123 二避免在key中使用短横线 <a id="bar" data-foo-bar-baz="fizz-buzz" href="#">f

Oracle 数据完整性(学习笔记)

数据完整性分类 1. 域完整性 域完整性又称为列完整性,指定一个数据集对某一个列是否有效和确定是否允许空值. 2. 实体完整性 实体完整性也可称为行完整性,要求表中每一行有一个唯一的标识符,即primary key. 3. 参照完整性 又称之为引用完整性. 主键和唯一键的主要区别: (1) 一个数据表只能创建一个主键约束,但可以创建若干个唯一键. (2)主键字段值不允许为空,而唯一键可以. 相同点: 两者均不允许表中的对应字段存在重复值,在创建主键和唯一键约束时会自动产生索引. 列级定义: 列级

data 简明笔记

显示或设置系统时间和日期 date [options] [+format] date [options] [new date] date用来显示系统的时间和日期,超级用户可以使用date来更改系统时钟 选项 -u               使用UTC(格林尼治)时间 示例 date $ date 2013年 01月 17日 星期四 15:38:31 CST

MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. 什么是子查询:当一个查询是另一个查询的子部分时,称之为子查询. 2. 查询的子部分,包含的情况: a) 目标列位置:子查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询只能返回一个字段 ( [Err] 1242 - Subquery returns more than 1

高级SQL语句

改变数据 insert record 插入一行 insert into foods (name, type_id) values ('Cinnamon Bobka', 1); 如果在insert语句中为每一列都提供了值,可以省去列名,顺序是表创建时的顺序. insert into foods values(NULL, 1, 'Blueberry Bobka'); 插入 a set of rows 子查询(subqueries)可以在insert语句中使用.既可以作为要插入值的一部分,也可以作为完