用户定义数据类型 User-defined types
-- 创建自定义数据类型
Create type person_name as varchar (20)
-- 使用自定义数据类型
Create table student
(sno char(10) primary key,
sname person_name
)
-- 删除自定义数据类型
Drop type person_name
域 Domains
CHECK
)-- 创建域
Create domain Dollars as numeric(12, 2) not null
-- 使用域
Create table employee
(eno char(10) primary key,
salary Dollars
);
大型对象类型 Large Object
Create table students
(sid char(10) primary key,
name varchar(10),
photo blob(20MB),
cv clob(10KB)) ;
单个表的约束
Not NULL
Primary Key
Unique
Check(P)
(P 为检查条件)域的约束
-- 创建带约束的域
-- 其中子句 Constraint ... 是可选的,用于当约束违背时指示更新违反了哪个约束
Create domain Dollars as numeric(12, 2) not null
Constraint money-positive-test Check (Dollars >= 0.00);
基本概念
级联 Cascading
NULL
SQL 实现
指定主键、候选键
-- 指定主键
primary key (customer-name, account-number)
-- 指定候选键
unique key (...)
指定外键
-- 默认情况,外键引用被引用表的主键属性
foreign key (account-number) references account
-- 指定外键引用的属性名称
foreign key (account-number) references account(account-number)
-- 行内简写
account-number char(10) references account
指定级联
-- 中括号内为可选项,分别对应级联删除、级联更新、级联操作
-- 在 SQL 语句中,不要出现下面的中括号
foreign key (branch-name) references branch
[ on delete cascade]
[ on update cascade]
[ on delete set null]
[ on update set null]
[ on delete set default]
[ on update set default]
示例:
Create table depositor (customer-name char(20), account-number char(10), primary key (customer-name, account-number), foreign key (account-number) references account on delete cascade, foreign key (customer-name) references customer on delete cascade );
基本概念
SQL 实现
基本语法
Create assertion assertion-name
Check <condition>;
SQL 无法表示形如 $for\ all\ X,P(X)$ 的表达式,需要转化为 $not\ exist\ X,such\ that\ not\ P(X)$ 的形式
**示例:**设置断言 “对每一笔借款, 至少有一个借款人有存款 $1000以上”
**分析:**上述断言等同于 “不存在这样一笔借款,其不存在存款在 $1000以上的借款人”
基本概念
示例:
假设银行不允许账户余额为负数,而是通过以下方式处理透支:
- 将账户余额设置为零
- 创建透支金额的贷款,为该贷款提供与透支账户账号相同的贷款编号
于是执行触发器的条件是:导致负余额值的账户关系更新
行级触发器 Row-Level Trigger
FOR EACH ROW
BEFORE
或 AFTER
,针对每一行数据触发一次INSERT
、UPDATE
、DELETE
NEW
和 OLD
关键字,可访问受影响的具体行数据
NEW
关键字不适于 DELETE
OLD
关键字不适于 INSERT
Referencing Old Row AS ...
或 Referencing New Row AS ...
语句来引用受影响行-- 中括号内为可选项,用于为触发器指定具体的触发属性列
-- 在 SQL 语句中,不要出现下面的中括号
CREATE TRIGGER trg-name
BEFORE UPDATE [OF attribute-name] ON table-name
FOR EACH ROW
BEGIN
IF NEW.salary < 0 THEN
... ;
END IF;
END;
-- 中括号内为可选项,用于为触发器指定具体的触发属性列
-- 在 SQL 语句中,不要出现下面的中括号
CREATE TRIGGER trg-name
BEFORE UPDATE [OF attribute-name] ON table-name
REFERENCING OLD ROW AS orow, NEW ROW AS nrow
FOR EACH ROW
BEGIN
IF nrow.salary < 0 THEN
... ;
END IF;
END;
语句级触发器 Statement-Level Trigger
FOR EACH STATEMENT
NEW
和 OLD
,因为它不针对具体行Referencing Old Table AS ...
或 Referencing New Table AS ...
来引用包含受影响行的临时表 (称为转换表,Transition Tables)CREATE TRIGGER trg-name
AFTER DELETE ON table-name
FOR EACH STATEMENT
BEGIN
... ;
END;