一、SQL Data Types and Schemas

  1. 用户定义数据类型 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 
    
  2. 域 Domains

    -- 创建域
    Create domain Dollars as numeric(12, 2) not null
    -- 使用域
    Create table employee 
    			        (eno char(10) primary key, 
    			         salary Dollars
    			        ); 
    
  3. 大型对象类型 Large Object

    Create table students 
    						(sid char(10) primary key, 
    						 name varchar(10), 
    						 photo blob(20MB), 
    						 cv clob(10KB)) ;
    

二、完整性约束 Integrity Constraints

1. 表和域的完整性约束

  1. 单个表的约束

  2. 域的约束

    -- 创建带约束的域
    -- 其中子句 Constraint ... 是可选的,用于当约束违背时指示更新违反了哪个约束
    Create domain Dollars as numeric(12, 2) not null
    Constraint money-positive-test Check (Dollars >= 0.00); 
    

2. 参照完整性 Referential Integrity

  1. 基本概念

  2. 级联 Cascading

  3. SQL 实现

    示例:

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

3. 断言 Assertions

  1. 基本概念

  2. SQL 实现

    **示例:**设置断言 “对每一笔借款, 至少有一个借款人有存款 $1000以上”

    **分析:**上述断言等同于 “不存在这样一笔借款,其不存在存款在 $1000以上的借款人”

    image.png

4. 触发器 Triggers

  1. 基本概念

    示例:

    假设银行不允许账户余额为负数,而是通过以下方式处理透支:

    • 将账户余额设置为零
    • 创建透支金额的贷款,为该贷款提供与透支账户账号相同的贷款编号

    于是执行触发器的条件是:导致负余额值的账户关系更新

  2. 行级触发器 Row-Level Trigger

    -- 中括号内为可选项,用于为触发器指定具体的触发属性列
    -- 在 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;
    
  3. 语句级触发器 Statement-Level Trigger

    CREATE TRIGGER trg-name
    AFTER DELETE ON table-name
    FOR EACH STATEMENT
    BEGIN
        ... ;
    END;