文章目录
一,SQL语言(一)
传送门:SQL 语言(一)
内容预览:
- SQL数据定义
- 基本数据类型
- 基本模式定义
- 基本查询结构
- 嵌套子查询
- 数据库修改
二,SQL语言(二)
传送门:SQL 语言(二)
内容预览:
- 视图(View)
- 索引(Index)
三,事务(transaction)
由查询和更新语句的序列组成。SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务。下列SQL语句之一会结束一个事务:
- Commit work:提交当前事务,也就是将该事务所做的更新在数据库中持久保存。在事务被提交后,一个新的事务自动开始。
- Rollback work:回滚当前事务,即撤销该事务中所有SQL语句对数据库的更新。这样,数据库就恢复到执行该事务第一条语句之前的状态。
动机示例:从账户A-101向A-201转账100元
update account set balance = balance–100
where account_number ='A-101';
update account set balance = balance + 100
where account_number ='A-201';
COMMIT WORK;
- 如果其中一个更新成功,另一个更新失败,会数据库中导致数据不一致问题
- 因此,这两个更新要么全部成功,要么全部失败
事务的四个性质
- 原子性(atomic)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability )
原子性(atomic)
- 一个事务或者在完成所有步骤后提交其行为,或者在不能成功完成其所有动作的情况下回滚其多有动作
在很多SQL实现中,默认方式下每个SQL语句自成一个事务,且一执行完就提交
- 如果一个事务要执行多条SQL语句,就必须关闭单独SQL语句的自动提交,如何关闭自动提交也依赖于特定的SQL实现。
一个较好的选择是,作为SQL:1999标准的一部分,允许多条SQL语句包含在关键字begin atomic … end之间
四,完整性约束
完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性
完整性约束的例子有:
- 教师姓名不能为null
- 任意两位教师不能有相同的教师标识
- course关系中的每个系名必须在department关系中有一个对应的系名
- 一个系的预算必须大于0.00美元
完整性约束包括:
- 域完整性
- 实体完整性(主键的约束)
- 参照完整性(外键的约束)
- 用户定义的完整性约束
完整性约束是数据库实例(Instance)必须遵循的。
完整性约束由DBMS维护。
1,单个关系上的约束
- not null
- unique
- check(<谓词>)
- 例:
CREATE TABLE instructor2
( ID char(5) primary key ,
name varchar(20) not null,
dept_name varchar(20),
salary numeric(8,2) not null,
check (salary >= 0));
2,域约束
域约束是完整性约束的最基本形式,可用于检测插入到数据库中的数据的合法性
从现有数据类型可以创建新的域
create domain Dollars as numeric(12, 2) not null
create domain Pounds as numeric(12, 2);
create table instructor
( ID char(5) primary key,
name varchar(20),
dept_name varchar(20),
salary Dollars,
comm Pounds);
check子句也可以应用到域上
- 例:check子句可以保证教师工资域中只允许出现大于给定值的值
create domain YearlySalary numeric(8, 2)
constraint salary_value_test check(value >= 29000.00);
YearlySalary 域有一个约束来保证年薪大于或等于29000.00美元
constraint salary_value_test 子句是可选的,它用来将该约束命名为salary_value_test。系统用这个名字来指出一个更新违反了哪个约束。
作为另一个例子
- 使用in子句