2010从入门到理解,数据存储

约束

北京pk赛车官网下载 1 

iOS应用数据存储的常用方式

主关键字限制(Primary Key Constraint)

用来钦定表中的一列或几列组合的值在表中具有唯风流罗曼蒂克性。塑造主键的目标是让外键来援引。

from Database Design to Physical Form

1. Plist存款和储蓄(属性列表卡塔尔

  • Plist存储(Documents)

// 1.Plist存储(生成plist文件)
// 在Plist文件中不能保存自定义对象*+
- (IBAction)saveBtn:(UIButton *)sender {
    // 参数:搜索的目录,搜索的范围,是否展开路径
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSLog(@"%@",path);

    // 1.把数组保存到沙盒
    NSArray *dataArray = @[@"LN",@10];
    NSString *filePath = [path stringByAppendingPathComponent:@"data.plist"];
    NSLog(@"%@",filePath);

    // 写入沙盒路径
    [dataArray writeToFile:filePath atomically:YES];

    // 2.把字典保存到沙盒
    NSDictionary *dict = @{@"name":@"LN",@"age":@10};
    NSString *dictPath = [path stringByAppendingPathComponent:@"dict.plist"];
    [dict writeToFile:dictPath atomically:YES];
}
  • Plist提取
  • 脾性: 只好存储系统自带的数据类型, 比方NSDictory, NSArray等等.
    自定义的目的不可能积攒

// 2.Plist提取
- (IBAction)readBtn:(UIButton *)sender {
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [path stringByAppendingPathComponent:@"data.plist"];
    NSArray *dataArray = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",dataArray);

    NSString *filePath1 = [path stringByAppendingPathComponent:@"dict.plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath1];
    NSLog(@"%@",dict);
}
Primary Key的创办格局

在创设表时成立Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创立主键,限定名称为t_idss。

CREATE TABLE

2. preference(偏幸设置卡塔尔国

  • 特色: 本质正是叁个plist文件; 也是只可以存款和储蓄系统自带的数据类型,
    自定义的对象不可能储存

  • NSUserDefaults:
    用来保存应用程序设置和属性、顾客保存的数码。客商再一次张开程序或开机后那一个数量照旧存在。

  • NSUserDefaults能够储存的数据类型满含:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。要是要存款和储蓄其余品类,则必要更改为前面包车型客车体系(日常调换到NSData),才具用NSUserDefaults存款和储蓄。

  • 偏疼设置存款和储蓄(Library/Preferences)

#define LNname @"name"
#define LNage @"age"

// 1.偏好设置存储(key存取,最好定义成宏以防写错)
// 偏好设置不能保存自定义对象*+
- (IBAction)saveBtn:(UIButton *)sender {
    // NSUserDefaults保存也是plist文件
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:@"LN" forKey:LNname];
    [defaults setObject:@10 forKey:LNage];

    // 写入文件当中
    [defaults synchronize];
    NSLog(@"%@",NSHomeDirectory());
}
  • 偏幸设置提取

// 2.偏好设置提取
- (IBAction)readBtn:(UIButton *)sender {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *name = [defaults objectForKey:LNname];
    NSInteger age = [defaults integerForKeyLNage];

    NSLog(@"%@ %ld",name,age);
}
删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

自律名与列名不均等,此处填写约束名

integrity constraints (完整性限制卡塔尔国

3. NSKeyedArchiver归档(NSCoding协议)

  • 特征: 能够积累自身定义的数据类型, 可是都以三遍性的全部据操作

Person

//  Person.h
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject<NSCoding>

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) Dog *dog;
@end

//  Person.m
#import "Person.h"
@implementation Person

// 归档存储会调用(在保存对象时要告诉保存对象那些属性)
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
    [aCoder encodeObject:self.dog forKey:@"dog"];
}

// 归档提取(解析文件的时候)会调用,(告诉当前要解析文件当中哪些属性)
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    /*
        当只有遵守了NSCoding协议时,才有[super initWithCoder]
    @interface Person : NSObject (父类NSObject没有遵守NSCoding协议,继承UIView就可以)
    */
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntForKey:@"age"];
        self.dog = [aDecoder decodeObjectForKey:@"dog"];
    }
    return self;
}
  • 归档存款和储蓄(tmp,生成的文本不得以一贯张开卡塔尔

// 归档
// 保存自定义对象(模型类要遵守<NSCoding>协议)*+
- (IBAction)saveBtn:(UIButton *)sender {Person *person = [[Person alloc] init];
    person.name = @"LN";
    person.age = 10;

    Dog *dog = [[Dog alloc] init];
    dog.name = @"xiao Hui";
    person.dog = dog;

    // 获取沙盒目录
    NSString *tmpPath = NSTemporaryDirectory();
    NSString *filePath = [tmpPath stringByAppendingPathComponent:@"Person.data"];
    NSLog(@"%@",NSTemporaryDirectory());

    // 归档(archiveRootObject会调用encodeWithCoder:)
    [NSKeyedArchiver archiveRootObject:person toFile:filePath];
}
  • 归档提取

// 2.归档提取
- (IBAction)readBtn:(UIButton *)sender {
    // 获取沙盒目录
    NSString *tmpPath = NSTemporaryDirectory();
    NSString *filePath = [tmpPath stringByAppendingPathComponent:@"Person.data"];

    //归档提取 unarchiveObjectWithFile会调用initWithCoder:
    Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@--%@",person.name,person.dog.name);
}
  • 注意点
    initWithCoderawakeFromNib

//从xib当加载的时候 (是加载完毕时调用)
-(void)awakeFromNib{
    NSLog(@"awakeFromNib==%@",self.btn);
    // awakeFromNib==<UIButton: 0x7ffd08c1e450; frame = (100 153; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7ffd08c1af60>>
}

//当解析一个文件的时候会调用initWithCoder (一开始加载Xib就调用)
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if(self = [super initWithCoder:aDecoder]){
        NSLog(@"initWithCoder==%@",self.btn);
        // initWithCoder==(null)
    }
    return self;
}
向已有表中加多Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

CREATE VIEW

4. SQLite3

  • 数据库(Database)是比照数据布局来组织、存款和储蓄和治本数据的酒店

  • 数据库能够分为2大类别

    • 关系型数据库(主流):如,MySQL
    • 嵌入式/移动顾客端 :如,SQLite 对象型数据库
  • 天性: 存款和储蓄一些多量的数目, 排序, 总结等操作

累计Primary Key的另风华正茂种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

尽管上述代码运营没难题,查看表格设计也得以看出Primary
Key设置成功,不过在剔除Primary Key操作时会提醒:
消息3728,级别16,状态1,第1 行
‘prod_id’ 不是束缚。
消息3727,级别16,状态0,第1 行
未能删除约束。请参阅前边的错误消息。
案由是增加Primary
Key语句中一直不用CONSTRAINT指明约束名,系统自动生成了主键名和平条节制名,要先查看主键名和限制名,删除时填写的也是封锁名。
这种气象的不易删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;

Security

什么是SQLite

  • SQLite是风姿洒脱款轻型的嵌入式数据库
  • 它占用能源充裕的低,在嵌入式设备中,大概只须要几百K的内部存款和储蓄器就够了
  • 它的管理速度比Mysql、PostgreSQL那七款著名的数据库都还快
多列组合加多主键节制
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);

The GRANT & REVOKE statements

何以存款和储蓄数据到数据库

  • 数据库的贮存结商谈excel很像,以表(table)为单位
外关键字节制(Foreign Key Constraint)

北京pk赛车官网下载,概念了表之间的关系,用来保险五个表之间的大器晚成致性的涉嫌。
在开创表时开创Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时索要先插入table2的数目,工夫打响插入table1的数码。更正table2.s_id数据,table1.s_id数据也会自行改换。可是修正table1.s_id数据,实行时报外键冲突。总的来说对table1设置外键关联table2后,table1的数额跟着table2走,不可能反着来。

累计和删除了那一个之外键节制同主键。

Catalogs

数据仓库储存款和储蓄数据的步调

  • 新建数据库文件
  • 新建一张表(table)
  • 增多多少个字段(column,列,属性)
  • 添增添行记录(row,每行贮存多个字段对应的值)

Navicat 是黄金时代套适用于MySQL,
SQLite等多个数据库系统地图形化数据库管理、报告以致监察和控制的工具。具备高品质的、商业智能的、强大的备份成效

UNIQUE约束

除主键外另黄金时代种能够定义唯一限定的等级次序,允许空值。加多UNIQUE的不二等秘书诀同上,这里只简单比方。

USE test
GO
ALTER TABLE table2
ADD CONSTRAINT uk_s_tellphone
UNIQUE(s_tellphone);

Schemas

斟酌根底:

  • 报表组成: 行(记录卡塔尔和列(属性卡塔尔(قطر‎

  • “属性” 是用来标记这一列应该存放什么

  • “记录” 是用来贮存一条数据

  • 质量类型

  • blob :二进制类型

  • integer : 整型

  • real : 浮点型

  • text :文本类型

null : 空

  • 主键

  • 主键(Primary Key,简单的称呼PK)用来唯黄金年代地标记某一条记下

例如t_student能够扩大二个id字段作为主键,也就是人的身份证

  • 主键能够是二个字段或多个字段

    例如: 行和列

  • 主键的布置性原则

    • 主键应当是对客商并没有趣的
    • 天荒地老也不要更新主键
    • 主键不应满含动态变化的数量
    • 主键应当由计算机自动生成
CHECK约束

分成表约束和列节制,用于限定字段值在有个别范围。

Introduction

SQL语言简要介绍

  • 特色:不区分朗朗上口写(比方数据库以为user和UsEr是近似的)
  • SQL中的常用关键字(注意:数据库中不得以利用主要字来命名表、字段)

select、insert、update、delete、from、create、where、desc、order、by、group、table、alter、view、index等等

  • SQL语句的类型

    • 数据定义语句(DDL:Data Definition Language)

    回顾create和drop, Alert等操作,在数据库中创建新表或删除表(create
    table或 drop table)

  • 多少操作语句(DML:Data Manipulation Language)

    席卷insert、delete、update等操作,下边包车型地铁3种操作分别用于增添、修正、删除表中的数据

  • 多少查询语句(DQL:Data Query Language)

能够用于查询获得表中的数据,关键字select是DQL(也是富有SQL)用得最多的操作,其余DQL常用的主要字有where,order
by,group by和having

添加CHECK约束
ALTER TABLE table2
ADD sex CHAR(2);--在table表中添加sex,数据类型为CHAR,用来存放性别
GO
ALTER TABLE table2
ADD CONSTRAINT ck_sex CHECK(sex in('男','女'));

注:这个时候sex列数据类型不能够是bit,若是填写bit,只好存款和储蓄0和1,用CHECK限定节制结果为男和女就能够报错。

  ->The DBA(数据库管理员) must begin by creating the tables
and constraints(节制) and loading the data. Impose(强加上) integrity constraints on the
columns 。

DDL语句

  • 创表

 格式
 create table 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;
 示例

 create table t_student (id integer, name text, age inetger, score real) ;



 经验

 实际上SQLite是无类型的

 就算声明为integer类型,还是能存储字符串文本(主键除外)



 建表时声明啥类型或者不声明类型都可以,也就意味着创表语句可以这么写:



 create table t_student(name, age);



 为了保持良好的编程规范、方便程序员之间的交流,编写建表语句的时候最好加上每个字段的具体类型



 语句优化



 创建表格时, 最好加个表格是否已经存在的判断, 这个防止语句多次执行时发生错误



 create table if not exists 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;
  • 删表

格式



 drop table 表名 ;



 drop table if exists 表名 ;



 示例



 drop table t_student ;



 语句优化



 删除表格时, 最好加个表格是否已经存在的判断, 这个防止语句多次执行时发生错误



 drop table if  exists 表名 ;
  • 修改表

注意: sqlite里面只能实现Alter Table的部分功能



 不能删除一列, 修改一个已经存在的列名



 修改表名



 ALTER TABLE 旧表名 RENAME TO 新表名



 新增属性



 ALTER TABLE 表名 ADD COLUMN 列名 数据类型 限定符
  • 约束

    • 简单易行节制

无法为空,not null :规定字段的值不能够为null
不可能再一次,unique :规定字段的值必须唯大器晚成
默许值,default :钦命字段的私下认可值

示例
`create table t_student (id integer, name text not null unique, age integer not null default 1) ;`

name字段不能为null,并且唯一
age字段不能为null,并且默认为1
  • 主键限制

增进主键约束的因由?
如果t_student表中就name和age三个字段,并且某些记录的name和age字段的值都大同小异时,那么就没办法分别那些数量,产生数据库的记录不唯风华正茂,那样就不方便管理数据,优秀的数据库编制程序规范应该要保管每条记下的唯风华正茂性,为此,扩大了主键节制,也正是说,每张表都必须有二个主键,用来标识记录的唯黄金年代性

  • 主键的宣示?

在创表的时候用primary key声可瑞康个主键

create table t_student (id integer primary key, name text, age integer) ;

integer类型的id作为t_student表的主键

  • 主键字段

若果注脚为primary key,就表明是贰个主键字段

主键字段暗许就隐含了not null 和 unique 多个节制

假若想要让主键自动增进(必得是integer类型),应该扩展autoincrement

create table t_student (id integer primary key autoincrement, name text, age integer) ;

在创设表的时候加多CHECK 约束
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    CONSTRAINT ck_t3_type CHECK(t3_type in('类型1','类型2','类型3')) 
)

加多了自律后只要插入不符合限定的数目

INSERT INTO table3(
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038219',
'李建',
'社会与科学',
'任何数据'
);

消息547,级别16,状态0,第1 行
INSERT 语句与CHECK
约束”ck_t3_type”冲突。该冲突时有发生于数据库”test”,表”dbo.table3″, column
‘t3_type’。

话语已消声匿迹。

  ->Then provide views(视图) of the data, virtually
restructuring the physical tables into variant(不同的) table forms, to
simplify access to data.

DML语句

  • 插入数据(insert)

 格式



 insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ;



 示例



 insert into t_student (name, age) values (‘sz’, 10) ;



 注意



 数据库中的字符串内容应该用单引号 ’ 括住
  • 立异数据(update)

格式



 update 表名 set 字段1 = 字段1的值, 字段2 = 字段2的值, … ;



 示例



 update t_student set name = ‘wex’, age = 20 ;



 注意



 上面的示例会将t_student表中所有记录的name都改为wex,age都改为20
  • 删除数据(delete)

格式



 delete from 表名 ;



 示例



 delete from t_student ;



 注意



 上面的示例会将t_student表中所有记录都删掉
  • 准绳语句

作用



 如果只想更新或者删除某些固定的记录,那就必须在DML语句后加上一些条件



 条件语句的常见格式



 where 字段 = 某个值 ;   // 不能用两个 =



 where 字段 is 某个值 ;   // is 相当于 =



 where 字段 != 某个值 ;



 where 字段 is not 某个值 ;   // is not 相当于 !=



 where 字段 > 某个值 ;



 where 字段1 = 某个值 and 字段2 > 某个值 ;  // and相当于C语言中的 &&



 where 字段1 = 某个值 or 字段2 = 某个值 ;  //  or 相当于C语言中的 ||
  • 条件语句演练

    示例

将t_student表中年纪大于10 並且 姓名不对等wex的记录,岁数都改为 5

删除t_student表中年龄低于等于10 可能 年龄当先30的笔录

估计下边语句的机能

update t_student set score = age where name = ‘wex’ ;

删除CHECK约束
ALTER TABLE table3
DROP CONSTRAINT ck_t3_type;

  ->Provide security(安全性),
so that only authorized users are able to read or update certain
confidential(机密的) data.

DQL

格式



 select 字段1, 字段2, … from 表名 ;



 select * from 表名;   //  查询所有的字段



 示例



 select name, age from t_student ;



 select * from t_student ;



 select * from t_student where age > 10 ;  //  条件查询
DEFAULT约束

透过定义列的私下认可值或使用数据库的暗中认可值对象绑定表列,来钦点列的暗中认可值。

  ->The structure of the various tables, views, and other objects
of a database are made available to the DBA through a set of
system-defined tables, called system
catalogs(系统目录卡塔尔.

询问有关语句

统计



 count(X)



 select count(*) from t_student



 select count(age) from t_student



 avg(X)



 计算某个字段的平均值



 sum(X)



 计算某个字段的总和



 max(X)



 计算某个字段的最大值



 min(X)



 计算某个字段的最小值



 排序



 查询出来的结果可以用order by进行排序



 select 字段1, 字段2 from 表名 order by 字段 ;



 select * from t_student order by age ;



 默认是按照升序排序(由小到大),也可以变为降序(由大到小)



 select * from t_student order by age desc ;  //降序



 select * from t_student order by age asc ;   // 升序(默认)



 也可以用多个字段进行排序



 select * from t_student order by age asc, height desc ;



 先按照年龄排序(升序),年龄相等就按照身高排序(降序)



 limit分页



 使用limit可以精确地控制查询结果的数量,比如每次只查询10条数据



 格式



 select * from 表名 limit 数值1, 数值2 ;



 示例



 select * from t_student limit 4, 8 ;



 可以理解为:跳过最前面4条语句,然后取8条记录



 分页



 limit常用来做分页查询,比如每页固定显示5条数据,那么应该这样取数据



 第1页:limit 0, 5



 第2页:limit 5, 5



 第3页:limit 10, 5



 第n页:limit 5*(n-1), 5



 特殊案例



 select * from t_student limit 7 ;



 相当于select * from t_student limit 0, 7 ;



 表示取最前面的7条记录
在建表时增添DEFAULT限制
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12) DEFAULT '类型1' 
)

 

多表查询

select 字段1, 字段2, … from 表名1, 表名2 ;



 别名



 select



 别名1.字段1 as 字段别名1,



 别名2.字段2 as 字段别名2,



 …



 from



 表名1 as 别名1,



 表名2 as 别名2 ;



 可以给表或者字段单独起别名



 as 可以省略



 表连接查询



 select 字段1, 字段2, … from 表名1, 表名2  where 表名1.id = 表名2.id;



 外键



 如果表A的主关键字是表B中的字段,则该字段称为表B的外键



 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。



12-(掌握)代码实现SQLite-DDL



 1. 创建一个Swift项目



 2. 导入系统框架sqlite3.tbd(sqlite3.dylib)



 3. 建立桥接文件, 导入头文件sqlite3.h



 1. 新建一个.h 头文件



 2. 设置为桥接文件
删除DEFAULT约束
ALTER TABLE table3
DROP CONSTRAINT DF__table3__t3_type__3D5E1FD2;
--DF__table3__t3_type__3D5E1FD2是DEFAULT约束的约束名

Integrity(完整性)

代码达成

1. 打开数据库



 2. 使用打开的数据库, 执行DDL语句, 创建一个数据库表



 3.  使用打开的数据库, 执行DDL语句, 创建一个数据库表



 3. 将数据库操作封装成一个工具类



13-(掌握)代码实现DML语句-Insert



 1. 创建一个Student类



 属性



 name



 age



 构造方法



 init(name: String, age: Int)



 2. 创建数据库操作方法



 数据库中, 对Student对象的操作封装



 insertStudent()



14-(了解)代码实现DML语句-Insert绑定参数



 准备语句(prepared statement)对象



 准备语句(prepared statement)对象一个代表一个简单SQL语句对象的实例,这个对象通常被称为“准备语句”或者“编译好的SQL语句”或者就直接称为“语句”。



 操作历程



 1. 使用sqlite3_prepare_v2或相关的函数创建这个对象



 如果执行成功,则返回SQLITE_OK,否则返回一个错误码



 2. 使用sqlite3_bind_*()给宿主参数(host parameters)绑定值



 sqlite3_bind_text



 参数1:



 准备语句



 参数2:



 绑定的参数索引  (从1开始)



 参数3:



 绑定的参数内容



 参数4:



 绑定的参数长度  (-1代表自动计算长度)



 参数5:



 参数的处理方式



 SQLITE_TRANSIENT 会对字符串做一个 copy,SQLite 选择合适的机会释放



 SQLITE_STATIC / nil  把它当做全局静态变量, 不会字符串做任何处理,如果字符串被释放,保存到数据库的内容可能不正确!



 注意: swift中没有宏的概念



 // 替换 sqlite3.h 中的宏



 private let SQLITE_TRANSIENT = unsafeBitCast(-1, sqlite3_destructor_type.self)



 3.  通过调用sqlite3_step() 一次或多次来执行这个sql



 对于DML语句, 如果执行成功, 返回SQLITE_DONE



 对于DQL语句, 通过多次执行获取结果集, 继续执行的条件是返回值 SQLITE_ROW



 4.  使用sqlite3_reset()重置这个语句,然后回到第2步,这个过程做0次或多次



 5. 使用sqlite3_finalize()销毁这个对象, 防止内存泄露
累计封锁不内定限制名
ALTER TABLE table3
ADD DEFAULT '类型2' FOR t3_type;
GO

  ->保险数据完整性(首要指数据的不错与意气风发致性)是数据库管理员的最关键职务之黄金年代。

DML语句-Insert插入数据优化

假设在实践多少个SQL语句在此以前, 手动开启事务, 在试行达成之后, 手动提交业务,
那样 再调用SQL方法实行语句时, 就不会再自动开启和交给业务

加上封锁钦命约束名
ALTER TABLE table3
ADD CONSTRAINT df_t3_type
DEFAULT '类型2' FOR t3_type;
GO

  ->能够通过自律(Constraint卡塔尔(قطر‎、准绳(Rule卡塔尔(قطر‎或许缺省值保险数据的完整性,也得以在利用程序层保证数据完整性(那是应用程序设计的难点),或透过触发器保障。

事务

NOT NULL约束

封锁字段值不为空。

  ->数据完整性类型包蕴:实体完整性、参照完整性和顾客定义完整性  

5. Core Data

  • 特点: 对SQLite3的豆蔻年华层面向对象的包装,
    本质依旧要转变来为对应的SQL语句去施行
建表时设置NOT NULL约束
CREATE TABLE table3(
    t3_id VARCHAR(12) NOT NULL,
    t3_name VARCHAR(20) NOT NULL,
    t3_class VARCHAR(12) NOT NULL,
    t3_type VARCHAR(12) NOT NULL 
)

    ->实体完整性(Entity Integrity卡塔尔:现实世界的实业是可分其他,即它们具备某种唯豆蔻梢头性标志。相应地,关系模型中主键应作为唯意气风发性标记。由此实体完整性法则规定基本关系的兼具主键(Primary
Key卡塔尔(قطر‎都没办法取空值(NULL卡塔尔国 。

钥匙串

  • 应用程式之间数据分享
  • 系统级其他加密, 安全性高
  • 当应用程式 被删除时, 存款和储蓄的数量依旧留存
为已存在的列增加NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NOT NULL;

   
 ->参照完整性(Referential Integrity)
:参照完整性维护表与表之间的相关性,平时用“主键(Primary
Key卡塔尔国/外键(Foreign KeyState of Qatar”有限帮衬,当中Foreign
Key能够取NULL值,或取其参照表中Primary Key只怕候选键的取值。

删除NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NULL;
GO

    ->客户定义的完整性(User_defined
Integrity
State of Qatar:针对某风华正茂具体数目标牢笼原则,由应用遇到决定。比方:某些属性具有缺省值、某些属性必需取惟风华正茂值(UNIQUE卡塔尔、有些非主属性无法取NULL值、某些属性的取值范围在0~100里边(CHECK卡塔尔(قطر‎等等。

自定义默许值对象保险数据完整性

CREATE DEFAULT date_today AS GETDATE();
--新建默认值对象名date_today,默认值为getdate()函数,获取当前日期
GO
EXEC sp_addtype date_time,'date','NULL';
--利用存储过程新建自定义数据类型date_time,参照系统数据类型date
GO
EXEC sp_bindefault 'date_today','date_time';
--将默认值对象date_today绑定到自定义数据类型date_time上
GO
CREATE TABLE table3(--新建table3,设置字段t3_date的数据类型为date_time
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    t3_date date_time
);
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038220',
'李建',
'社会与科学',
'类型1'
);
GO
SELECT * FROM table3;--查询table3数据,看t3_date是否有默认值为当前日期

查询结果如下
北京pk赛车官网下载 2

ALTER TABLE table3
ADD t3_date1 DATE;--在table3表中新增一列t3_date1,数据类型为DATE
GO
EXEC sp_bindefault 'date_today','table3.t3_date1';
--直接将默认值对象date_today绑定到table3的t3_date1列
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date和t3_date1的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038221',
'李建',
'社会与科学',
'类型'
);
GO
SELECT * FROM table3;
GO

查询结果如下
北京pk赛车官网下载 3

  ->数据完整性具体落到实处包含两类

积累进度查询暗中同意值对象的持有者
USE test
EXEC sp_help date_today;
GO

结果如图所示
北京pk赛车官网下载 4

    ->证明性数据全部性
:申明性数据总体性用限制(Constraint卡塔尔、准绳(Rule卡塔尔在数据库中提供保证,那是保障完整性的较好格局。它驻留在数据库内,编制程序简单,开支小,能更聚集管理和保障数据的生机勃勃致性

去除暗中认可值对象
DROP DEFAULT date_today;

删去不成功,提醒以下新闻:
消息3716,级别16,状态3,第1 行
不只怕删除暗中同意值’date_today’,因为它已绑定到贰个或多个列。
这正是说我们精晓,当三个私下认可值对象绑定了列其后,就不能删除它,假设想要删除,就务须先解绑。在上面包车型地铁操作中,大家的私下认可值对象date_today绑定了test数据库table3表的t3_date1字段。

    ->进度性数据全体性
:进程性数据完整性用触发器和应用程序代码保障,平常相比复杂、开销相当大,但能够进行越来越多的业务法规。
平日,进度性数据完整性是注解性数据完整性的补给

对列解绑默许值对象
USE test
GO
EXEC sp_unbindefault 'table3.t3_date1';

此刻我们再次尝试删除默许值对象,开采照旧特别,那个时候要留意,在地方的操作中,暗中认可值对象date_today不仅仅绑定了t3_date1列,还绑定了自定义数据类型date_time,并将该数据类型定义给了t3_date列,大家还须求对date_time解绑暗中认可值对象。

EXEC sp_unbindefault 'date_time';

当时再一次删除默许值对象,就足以成功删除。删除暗中认可值对象后,原先绑定的字段不会再有暗中同意值。

           北京pk赛车官网下载 5

自定义准绳维护数据完整性

准则是对列或自定义数据类型的值的分明和限量。自定义法规的表明式必需求赶回布尔类型的值,并且表明式中无法包罗七个变量。

CREATE RULE score_rule AS @math_score>=0;
GO--新建规则score_rule,参数@math_score
EXEC sp_addtype 'score_type','float','NULL';
GO--新建自定义数据类型score_type
CREATE TABLE table_score(--新建表table_score,预设mt_score和at_score字段用于绑定规则
s_id VARCHAR(4),
s_name VARCHAR(10),
mt_score float,--该字段将用于规则score_rule绑定到列
at_score score_type--该字段将用于规则score_rule绑定到自定义数据类型
);
GO
EXEC sp_bindrule 'score_rule','score_type';
GO--将score_rule规则绑定到自定义数据类型score_type
EXEC sp_bindrule 'score_rule','table_score.mt_score';
GO--将score_rule规则绑定到table_score表的mt_score列

----以下进行规则测试
INSERT INTO table_score(
s_id,
s_name,
mt_score,
at_score
)VALUES(
'0001',
'张华',
'-1',
'-1'
);
GO

开展违反准绳的插入后,数据库报错
消息513,级别16,状态0,第1 行
列的插入或更新与早先的CREATE RULE
语句所钦点的法则发生冲突。该语句已结束。冲突发生于数据库’test’,表’dbo.table_score’,列’mt_score’。

言辞已告风姿罗曼蒂克段落。
很明显,mt_score的插入值为-1,违反了总得大于等于0的规行矩步,数据库报错。将mt_score的插入值改成符合准绳的数目,再一次运转插入语句,数据库依然会报错,因为at_score字段的插入值也是反其道而行之法则的。将几个数据改成相符准绳的归来,执行成功。

注:新建准则时表达式必须要是回来布尔类型的值,不然会报错

消息4145,级别15,状态1,过程sum_score,第1 行
在应选择口径的上下文(在’;’ 周边卡塔尔中钦赐了非布尔类型的表明式。

                 北京pk赛车官网下载 6

剔除自定义法规

和自定义暗中认可值对象相同,删除自定义法规必要该法规先与字段和自定义数据类型解绑。在地方的操作中,score_rule准绳与自定义数据类型score_type以及列mt_score已绑定。因而试行以下语句:

EXEC sp_unbindrule 'score_type';
GO--解除规则score_rule与score_type之间的绑定
EXEC sp_unbindrule 'table_score.mt_score';
GO--解除规则score_rule与表table_score的mt_score列的绑定
DROP RULE score_rule;--删除score_rule规则

注:经过试验,二个列只好绑定1条法规,如若对叁个列绑定2条准绳,前一条准则会被后一条准绳顶替。

           

查阅自定义准绳
EXEC sp_help 'score_rule';

结果如图所示
北京pk赛车官网下载 7

-》》》完整性再解说

翻开自定义法则的概念音讯
EXEC sp_helptext 'score_rule';
GO

结果如图所示
北京pk赛车官网下载 8

     数据具备复杂的数据类型,用来知足不一致的急需。实际应用中的数据也具有必然的取值范围,如年龄比异常的大于0,性别只有儿女等。而表之间的联系使相连的字段要保持风流洒脱致和总体。不过,实操不能够作保插入和删除的数码都适合必要,不切合须要的操作相当的大概会破坏数据的完整性,对数据库的可信性和运营本事形成威迫。

所以贮存数据集的数据库一定要对数据表和列有所限定和职业,为此SQLServer系统使用生龙活虎多级的办法来维护数据完整性。

数据的完整性:数据的完整性是指数据库中多少的不易和意气风发致性,表内的多少不相冲突,表间的多寡不相冲突,关联性不被磨损。

为此有了以下施行完整性的路线:

1.        对列数据的支配:数据证实限制、暗中同意值约束、准绳。

2.        对列的操纵:主键节制、唯后生可畏性约束、标记列。

3.        对表之间、列之间涉及的操纵:外键限定、数据证实节制、触发器、存储进度。

那几个途径得以根据项目分为:限定、准则、暗中认可值、触发器、存储进程。

封锁分为以下几点:

l        主键约束

主键:PTucsonIMATucsonY
KEY,主关键字,用来约束列的数额颇负唯风姿罗曼蒂克性且不为空,即这一字段的多少未有再一次的多寡值且不能够有空值。每一种表只好有叁个主键,平日用来做标记。

l        外键约束

外键:FOREIGN
KEY,外键用来在三个表的数额里面确立连接,它能够是一列大概多列。三个表能够有一个依然七个外键。外键对应的是参照完整性,多个表的外键可认为空值,若不为空值则每一种外键值必需等于另一个表中主键的某部值。

l        标识列

能够活动编号的列称为标记列或IDENTITY限制。IDENTITY限制正是为那些数值顺序依次增加的列希图的封锁,自动完结数值的增加。每一个表只能有一个标志列,标识数据不能够由客商输入,顾客只要求填写标记种子(标记列的率先个数据卡塔尔和标志增量(依次增加的数卡塔尔国,系统自动生成数据并填入表。标记种子和标记增量都是非零整数,位数紧跟于等于10。默许两者均为1。

l        唯大器晚成性限制

又叫UNIQUE节制,在主键限定中也采纳了唯生机勃勃性,不一致的是二个表中能够有三个如此的必经之路性列,却不能不有贰个主键。这里的唯意气风发性列可感到空但是不能不有后生可畏行数据为空。适用于不是主键但却还是必要具有唯黄金年代性的字段。

l        非空节制

三个列是不是允许有空值,正是此处的空和非空限制,即NULL与NOT
NULL限制。NULL便是同意为空,NOT
NULL正是不容许为空。NULL分歧于0和“”,0和“”都代表为该行有多少,而NULL是从没有过数据。

l        数据印证约束

又称做CHECK约束,它通过给定条件(逻辑表明式卡塔尔来检查输入数据是还是不是切合供给,以此来维护数据完整性。

l        暗许值限制

又称作DEFAULT限制。将常用的数码值性认为私下认可值能够省去客户输入的光阴,在非空字段中定义默许值能够减掉不当发生。在实际上利用中,私下认可值还足以是结果能变的函数。

 

规则:

平整是单身的SQL
Server对象,跟表和视图同样是数据库的组成部分。法规的功效和CHECK限制相同,用于实现对数据值的考察。它能够提到到两个表,在数据库中有邮局插入、改良时,验证新数据是还是不是顺应法规,是实现域完整性的章程之生机勃勃。法规在概念时并从未定义它的检验对象,而是在开立后绑定到对象来检查实验数据。

创建法规

CREATE RULE 规则名

AS

标准化表明式

在这里边的基准表明式使用逻辑表明式,表明式中要有叁个@初始的变量,代表客户的输入数据,能够当做是代表WHERE前面包车型客车列名。

法则在绑定之后才方可选择,准绳的绑定需求时用系统存款和储蓄进度sp_bindrule.

USE 数据库名

Go

Sp_bindrule 规则名 表名.字段名

采纳存款和储蓄进程sp_help来查看准则。

平整的表征(与CHECK的例外)

1卡塔尔(قطر‎       准则是SQL Server的靶子而CHECK是豆蔻梢头种限制,是表定义的意气风发有些。

2State of Qatar       CHECK的先行级要压倒准绳。

3卡塔尔       一个列只好采纳三个平整却得以选用多个CHECK约束。

4卡塔尔国       准则能够利用于八个列,CHECK节制只针对它定义的列。

5卡塔尔国       法则创设二回能够利用频仍而CHECK约束需求一再开立。

默认值:

CREATE DEFAULT 私下认可值名

AS 常亮表明式

与创建准绳平等,暗许值的定义不能够包涵列名,必要绑定到列或是别的数据库对象本领使用。一个列只好绑定一个私下认可值

 

Definition 7.1.2 Column Constraint

       NOT NULL -If NOT NULL appears in a col_constr, then the DEFAULT
clause cannot specify NULL;

       CONSTRAINT-allows us to specify a name for each constraint other
than NOT NULL, so that we can later drop the constraint with an ALTER
Table statement.

       UNIQUE- It can be specified even if NOT NULL is not, and the
column is then constrained so that all non-null values in the table are
unique, but multiple nulls can exist for this column.       

       PRIMARY KEY -A column with the PRIMARY KEY column constraint is
implicitly defined to be NOT NULL and UNIQUE. The UNIQUE clause and
PRIMARY KEY clause cannot both be used for a column, although the
PRIMARY KEY clause and the NOT NULL clause can be used together.

       CHECK

       EXAMPLE

       北京pk赛车官网下载 9

              北京pk赛车官网下载 10

 

                      北京pk赛车官网下载 11

                    触发器

                 

触发器的牵线

 

  1. 1

    触发器(trigger)是个新鲜的积累进程,它的实行不是由程序调用,亦非手工业运转,而是由事件来触发,当对三个表举行操作(
    insert,delete,
    update)时就能够激活它实施,触发器平常用来进步数据的完整性约束和事情法则等。其实往轻松了说,正是触发器正是二个开关,担负灯的亮与灭,你动了,它就亮了,就那一个意思。

    北京pk赛车官网下载 12

    END

触发器的归类

 

  1. 1

    DML( 数据操纵语言 Data Manipulation
    Language)触发器:是指触发器在数据库中发出DML事件时将启用。DML事件即指在表或视图中期维修改数据的insert、update、delete语句。

  2. 2

    DDL(数据定义语言 Data Definition
    Language)触发器:是指当服务器或数据库中发出(DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。

  3. 3

    登入触发器:是指当顾客登入SQL SE奥迪Q5VE兰德兰德酷路泽实例构造建设会话时接触。

    END

DML触发器介绍

 

  1. 1

    在SQL SE讴歌RDXVE凯雷德二〇〇八中,DML触发器的实现应用三个逻辑表DELETED和INSERTED。那五个表是树立在数据库服务器的内部存款和储蓄器中,大家唯有只读的权限。DELETED和INSERED表的布局和触发器所在的数据表的组织是同等的。当触发器施行到位后,它们也就能被自动删除:INSERED表用于存放你在操件insert、update、delete语句后,更新的笔录。举个例子你插入一条数据,那么就会把那条记下插入到INSERTED表:DELETED表用于寄放你在操作
    insert、update、delete语句前,你创建触发器表中数据。

  2. 2

    触发器可通过数据库中的相关表完成级联校订,能够强逼比用CHECK限制定义的自律越来越复杂的限制。与
    CHECK
    约束差异,触发器能够援引别的表中的列,举个例子触发器能够采纳另三个表中的
    SELECT
    相比插入或更新的多少,以致奉行别的操作。触发器也得以借助数据改进前后的表状态,再行选取对策。三个表中的八个同类触发器(INSERT、UPDATE
    或 DELETE)允许选择四个不一致的计策以响应同叁个改造语句。

  3. 3

    何况,即便触发器效用强大,轻便可靠地促成无数目眩神摇的效果与利益,为啥又要慎用?过多触发器会引致数据库及应用程序的保养困难,同临时候对触发器过分的依据,势必影响数据库的构造,同不经常候扩展了保证的眼花缭乱程序。

    END

触发器步骤精解

 

  1. 1

    率先,大家来尝试创立二个触发器,需要就是在AddTable这几个表上创立三个Update触发器,语句为:

    create trigger mytrigger on AddTable
    for update

    北京pk赛车官网下载 13

  2. 2

    接下来正是sql语句的部分了,主假诺假设发生update以往,需求触发器触发一个怎么着操作。这里的情致正是要是现身update了,触发器就能够触发输出:the
    table was updated!—By 小猪也无语。

    北京pk赛车官网下载 14

  3. 3

    接下去我们来将AddTable表中的数据施行二个改换的操作:

    北京pk赛车官网下载 15

  4. 4

    实践后,我们会意识,触发器被触发,输出了大家设置好的文本:

    北京pk赛车官网下载 16

  5. 5

    那触发器成立今后吧,它就规范开班职业了,那时我们须要改动触发器的话,只要求将启幕的create创立变为alter,然后改善逻辑就可以:

    北京pk赛车官网下载 17

  6. 6

    风度翩翩旦大家想查看某叁个触发器的原委,直接运转:exec sp_helptext
    [触发器名]

    北京pk赛车官网下载 18

  7. 7

    要是自身想查询当前数据库中有多少触发器,以有帮助自个儿进行数据库维护,只供给周转:
    select * from sysobjects where xtype=’TR’

    北京pk赛车官网下载 19

  8. 8

    小编们只要急需关闭或然开启触发器的话,只须要周转:

    disable trigger [触发器名] on database –禁止使用触发器

    enable trigger [触发器名] on database –开启触发器

    北京pk赛车官网下载 20

  9. 9

    那触发器的效应虽大,但是要是触及,苏醒起来就相比较勤奋了,那我们就要求对数据举行保养,这里就要求用到rollback数据回滚~

    北京pk赛车官网下载 21

  10. 10

    第九步的意趣便是查询AddTable表,借使中间存在TableName=newTable的,数据就回滚,触发器中止,那我们再开展一下测验,对AddTable表进行转移,开掘,触发update触发器之后,因为有数据爱惜,触发器中止:北京pk赛车官网下载 22

    北京pk赛车官网下载 23

  11.  

 北京pk赛车官网下载 24

北京pk赛车官网下载 25

北京pk赛车官网下载 26

北京pk赛车官网下载 27

北京pk赛车官网下载 28

北京pk赛车官网下载 29

北京pk赛车官网下载 30

北京pk赛车官网下载 31

北京pk赛车官网下载 32

北京pk赛车官网下载 33

北京pk赛车官网下载 34

北京pk赛车官网下载 35

北京pk赛车官网下载 36

 

 北京pk赛车官网下载 37

北京pk赛车官网下载 38

北京pk赛车官网下载 39

北京pk赛车官网下载 40

北京pk赛车官网下载 41

北京pk赛车官网下载 42

北京pk赛车官网下载 43

北京pk赛车官网下载 44

北京pk赛车官网下载 45

北京pk赛车官网下载 46

北京pk赛车官网下载 47

北京pk赛车官网下载 48

北京pk赛车官网下载 49

北京pk赛车官网下载 50

北京pk赛车官网下载 51

北京pk赛车官网下载 52

北京pk赛车官网下载 53

北京pk赛车官网下载 54

北京pk赛车官网下载 55

北京pk赛车官网下载 56

北京pk赛车官网下载 57

北京pk赛车官网下载 58

北京pk赛车官网下载 59

北京pk赛车官网下载 60

北京pk赛车官网下载 61

北京pk赛车官网下载 62

北京pk赛车官网下载 63

北京pk赛车官网下载 64

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注