澳门新莆京手机网站-新蒲京娱乐场 > 澳门新莆京手机网站 > Chapter 7 Integrity(完整性), Views(视图), Security(安全性), and Catalogs(目录)

Chapter 7 Integrity(完整性), Views(视图), Security(安全性), and Catalogs(目录)

约束

图片 1 

iOS应用数据存款和储蓄的常用情势

生龙活虎、数据库完整性概述

主关键字限定(Primary Key Constraint)

用来钦命表中的一列或几列组合的值在表中享有唯生龙活虎性。建立主键的目标是让外键来援用。

from Database Design to Physical Form

1. Plist存款和储蓄(属性列表State of Qatar

  • 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);
}

1.数据库的完整性:

删除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)

概念了表之间的关系,用来有限支撑多少个表之间的少年老成致性的涉嫌。
在开创表时开创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

学子的年龄必需是整数,取值范围为14-29;

添加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声贝拉米(Bellamy卡塔尔国个主键

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()销毁这个对象, 防止内存泄露

2.DBMS爱抚数据库完整性的机制:

累积封锁不钦命限制名
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语句去实践

   DBMS应提供定义数据库完整性节制标准,并把它们存入数据库中。

建表时设置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卡塔尔(قطر‎ 。

钥匙串

  • APP之间数据共享
  • 系统级其他加密, 安全性高
  • 当应用软件 被删去时, 存款和储蓄的数码依旧存在

②提供完整性检查的不二秘诀

为已存在的列加多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或然候选键的取值。

   检查数据是还是不是知足完整性节制原则的体制称为完整性检查。平常在INSERT、UPDATE、DELETE语句试行后初始反省。

删除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是否有默认值为当前日期

询问结果如下
图片 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

询问结果如下
图片 3

  ->数据完整性具体贯彻富含两类

3.违背规定管理

储存进程查询暗中同意值对象的主人
USE test
EXEC sp_help date_today;
GO

结果如图所示
图片 4

    ->注明性数据完整性 :申明性数据完整性用节制(Constraint卡塔尔、法则(RuleState of Qatar在数据库中提供承保,这是确认保障完整性的较好办法。它驻留在数据库内,编程轻便,开销小,能更聚集管理和保证数据的风姿洒脱致性

DBMS若觉察顾客的操作违背了完整性约束原则,就接收一定的动作以保险数据的完整性,如拒却施行该操作,或级联实施其它操作。

去除默许值对象
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';

那儿重新删除暗中同意值对象,就能够成功删除。删除默许值对象后,原先绑定的字段不会再有默许值。

           图片 5

图片 6

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

平整是对列或自定义数据类型的值的规定和范围。自定义准绳的表明式一定要回来布尔类型的值,况兼表明式中无法饱含多个变量。

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 行
在应采用原则的上下文(在';' 相近卡塔尔中钦赐了非布尔类型的表明式。

                 图片 7

 

去除自定义准绳

和自定义暗许值对象同样,删除自定义法则须求该准则先与字段和自定义数据类型解绑。在下面的操作中,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';

结果如图所示
图片 8

-》》》完整性再解说

二、缺省(默认值)和规则

翻看自定义法则的定义新闻
EXEC sp_helptext 'score_rule';
GO

结果如图所示
图片 9

     数据具备根深蒂固的数据类型,用来满意分裂的供给。实际运用中的数据也装有一定的取值范围,如岁数非常大于0,性别独有孩子等。而表之间的关联使相连的字段要保持风姿罗曼蒂克致和完全。可是,实操不恐怕承保插入和删除的数码都符合必要,不符合必要的操作极或者会损坏数据的完整性,对数据库的可信性和平运动作才具变成威吓。

 

据此存放数据集的数据库必定要对数据表和列有所节制和正规,为此SQLServer系统使用风流洒脱多重的艺术来维护数据完整性。

缺省和法则来源于由Sybase开采的S私下认可值QL Server,在老版本的SQL Server或然晋级版本中都有缺省和准绳的运用。

数量的完整性:数据的完整性是指数据库中数据的科学和后生可畏致性,表内的数额不相矛盾,表间的数额不相冲突,关联性不被毁损。

缺省是为列提供数据的风姿罗曼蒂克种方式,倘若客商张开INSERT操作时不为列输入数据,则利用缺省值。

为此有了以下实践完整性的门路:

法则是当客户展开INSERT或uPDATE操作时,对输入列中的数据设定的取值范围,是完结域完整性的方法之大器晚成。

1.        对列数据的操纵:数据申明限制、默认值节制、法规。

 

2.        对列的控制:主键限定、唯生龙活虎性约束、标记列。

缺省与准则有以下特点:

3.        对表之间、列之间涉及的垄断:外键限制、数听别人证明约束、触发器、存款和储蓄进程。

(1卡塔尔(قطر‎缺省与准绳是数据库对象,它们是单身于表和列而建设布局的。

那个路子得以依照项目分为:限制、法规、暗许值、触发器、存款和储蓄进度。

(2卡塔尔缺省与准则创设后与列或数据类型产生关联,列和数据类型就持有了缺省与法则的质量。

自律分为以下几点:

(3卡塔尔缺省与法规定义后,能够重复使用,能够绑定到八个列或数据类型上。

l        主键节制

(4卡塔尔缺省与法则不随表同不经常候调入内部存款和储蓄器,当用届期才被调入内部存款和储蓄器,那可能会使程序施行现身延时。

主键:PTiguanIMA宝马X5Y KEY,主关键字,用来界定列的数目有所唯后生可畏性且不为空,即这一字段的数码未有再一次的数额值且无法有空值。各类表只能有叁个主键,日常用来做标志。

 

l        外键节制

缺省和法则对象平常只在它所开创的数据库中央银一蹴而就,不是ANSI标准,经常不提倡使用。

外键:FOREIGN KEY,外键用来在三个表的数额里面创建连接,它可以是一列大概多列。一个表能够有叁个照旧五个外键。外键对应的是参照完整性,一个表的外键可认为空值,若不为空值则每贰个外键值必得等于另一个表中主键的某些值。

应尽恐怕使用约束,任何能够应用缺省与准则之处都有可以利用约束。

l        标识列

 

能够活动编号的列称为标记列或IDENTITY约束。IDENTITY限定便是为这么些数值顺序依次增加的列计划的约束,自动完结数值的充裕。每种表只好有一个标记列,标志数据不能够由客商输入,顾客只需求填写标记种子(标记列的首先个数据卡塔尔国和标识增量(依次增加的数卡塔尔,系统自动生成数据并填入表。标志种子和标识增量都是非零整数,位数稍差于等于10。暗中认可两个均为1。

1. 缺省

l        唯风流倜傥性节制

在SQL Server中,有二种接收默许值的艺术:

又叫UNIQUE约束,在主键节制中也应用了唯意气风发性,不一样的是叁个表中能够有多个如此的唯豆蔻梢头性列,却必须要有多个主键。这里的并世无双性列可以为空不过不能不有风姿罗曼蒂克行数据为空。适用于不是主键但却照旧供给具备唯豆蔻梢头性的字段。

 

l        非空限制

①在开创表时,钦定私下认可值。

多个列是不是同意有空值,正是这里的空和非空限制,即NULL与NOT NULL约束。NULL正是同意为空,NOT NULL正是区别意为空。NULL差别于0和“”,0和“”都代表为该行有多少,而NULL是绝非多少。

  用SQL Server Management Studio创造表时在统筹表时钦定默许值,能够在输入字段名称后,设定该字段的暗中同意值。

l        数听大人评释约束

  或选择CREATE TABLE语句中的DEFAULT子句钦点私下认可值。

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

 

l        暗中认可值节制

②行使CREATE DEFAULT语句创建私下认可对象后,使用存款和储蓄进度sp_bindefault将该暗许对象绑定到列上。

又称作DEFAULT约束。将常用的数额值性认为暗中认可值能够省去客商输入的时光,在非空字段中定义默许值能够减掉不当产生。在实际应用中,暗中同意值还足以是结果能变的函数。

 

 

暗中认可值对象是独立存款和储蓄的,删除表的时候,DEFAULT约束会活动删除,不过暗中同意值对象不会被删除。

规则:

开创私下认可值对象后,须要将其绑定到某列大概客商自定义的数据类型上。

Copyright © 2015-2019 http://www.carrefourstation.com. 澳门新莆京手机网站-新蒲京娱乐场有限公司 版权所有