利用SQL语言实现数据库的静态完整性


目录:1.静态约束的形式和内容

   2.SQL语言实现约束的方法:Create Table(列约束和表约束)

   3.SQL语言实现约束的方法:断言

1.SQL约束

  (1)静态约束

    1)列完整性——域完整性约束

    2)表完整性——关系完整性约束

  (2)动态约束:触发器

2.静态约束的约束规则的一般形式

    Integrity Constraint ::= (O, P, A, R)

  (1)O:列或者表

  (2)P:需要定义

  (3)A:更新时检查(默认)

  (4)R:拒绝(默认)

3.SQL语言实现约束的方法(1)——Create Table

  (1)Create Table的三种功能:定义关系模式,定义完整性约束,定义物理存储特性

  (2)定义完整性约束条件

    1)列完整性

    2)表完整性

  (3)CREATE TABLE的定义格式

    CREATE TABLE tablename

    (( colname datatype [ DEFAULT { default_constant | NULL } ]   //列约束

        [ col_constr { col_constr ... } ] | , table_constr  //表约束

    {, { colname datatype [ DEFAULT { default_constant | NULL } ]

        [ col_constr { col_constr ... } ] | , table_constr }

    ... } );

  (4)Create Table包含Col_constr列约束和Table_constr表约束

4.Col_constr列约束

  (1)一种域约束类型,对单一列的值进行约束

  (2)格式

    { NOT NULL |    //列值非空

      [ CONSTRAINT constraintname ]    //为约束名,便于以后撤销

        { UNIQUE     //列值是唯一

          | PRIMARY KEY    //列是主键

          | CHECK (search_cond)    //(谓词,为真时更新才能允许)列值满足条件,条件只能使用列当前值

          | REFERENCES tablename [(colname)]  //references表明将这一列定义为外键,colname 省略表明该列名和另一个表tablename的主键名相同;若不省略,应说明tablename的哪一列对应此外键列

            [ON DELETE { CASCADE | SET NULL}]  } }  //关联性删除问题:若加上 ON DELETE子句,则“若删除tablename中的一个元组,该元组中有一个属性值与外键对应,外键对应的该行应该被删除”

    //引用另一个表tablename 的列colname的值,如有 ON DELETE CASCADE 或 ON DELETE SET NULL语句,则删除被引用表的某列值 v 时,要将本表该列值为 v 的记录删除或列值更新为 null;缺省为无操作

  (3)Col_constr 列约束:只能应用在单一列上,其后面的约束如UNIQUE, PRIMARY KEY 及 search_cond 只能是单一列唯一,单一列为主键,单一列相关

5.Col_constr列约束举例

    Create Table Student (S# char(8) not null unique,  //S#是主键

              Sname char(10),

              Ssex char(2) constraint ctssex check (Ssex = '男' or Ssex = '女'),  //定义了一个约束 ctssex(可单独处理),谓词检查

              Sage integer check (Sage > 1 and Sage < 150),    //整形年龄,无约束名(无法单独处理),谓词检查

              D# char(2) references Dept(D#) on delete cascade,  //如果Dept中删除某一元组,将Student表中涉及到D#的同学的信息全部删除

              Sclass char(6) );

  (2)Create Table Course ( C# char(3),

              Cname char(12),

              Chours integer,

              Credit float(1) constraint ctcredit check (Credit >= 0.0 and Credit <=5.0),  //定义名叫 ctcredit 的约束,学分在0.0-5.0之间

              T# char(3) references Teacher(T#) on delete cascade );   //定义关联性删除

6.table_constr 表约束

  (1)一种关系约束类型,对多列或元组的值进行约束

  (2)[ CONSTRAINT constraintname ]  //约束命名,便于以后撤销

      { UNIQUE (colname{, colname ...})  //几列值组合在一起是唯一

      | PRIMARY KEY (colname {, colname ...})  //几列联合为主键

      | CHECK (search_condition)  //元组多列值共同满足条件,条件中只能使用同一元组的不同列当前值

      | FOREIGN KEY (colname {, colname ...})

        REFERENCES tablename [(colname {, colname ...})]

        [ON DELETE CASCADE] }  //引用另一个表的若干列作为外键

  (3)table_constr表约束:是应用在关系上,即对关系的多列或元组进行约束,列约束是其特例

7.Table_constr表约束举例

  (1)Cteate Table Student ( S# char(8) not null unique,

                 Sname char(10),

                 Ssex char(2) constraint ctssex check (Ssex = '男' or Ssex = '女'),  //也可以用列约束来定义

                 Sage integer check (Sage > 1 and Sage < 150),

                 D# char(2) references Dept(D#) on delete cascade,

                 Sclass char(6),

                 primary key(S#));

  (2)Create Table Course ( C# char(3),

                Cname char(12),

                Chours integer,

                Credit float(1) constraint ctcredit check (Credit >= 0.0 and Credit <= 5.0),

                T# char(3) references Teacher(T#) on delete cascade,

                primary key(C#), constraint ctcc check (Chours/Credit = 20));  //涉及Chours和Credit两列,必须用表约束

  (3)Create Table SC (S# char(8),

              C# char(3),

              Score float(1) constraint ctscore check (Score >= 0.0 and Score <=100.0),

              foreign key(S#) references student(S#) on delete cascade,

              foreign key(C#) references course(C#) on delete cascade );  //定义了两个外键

  (4)包含Select-From-Where子查询的check语句

    Create Table SC (S# char(8) check ( S# in (select S# From Student) ),  //相当于外键,涉及到表Student

            C# char(3) check( C# in (select C# From Course) ),  //相当于外键,涉及到表Course

            Score float(1) constraint ctscore check (Score >= 0.0 and Score <= 100.0) );

8.Create_Table的撤销和追加(仅了解即可)(表定义结束后,通过Alter Table调整表的信息)

  (1)撤销或追加约束的语句:Alter Table

  (2)ADD CONSTRAINT constr_name  //新增一个约束

  (3)DROP CONSTRAINT constr_name  //撤销一个约束

  (4)DROP PRIMARY KEY  //撤销一个主键

  (5)MODIFY   //新增一个约束的关键词

9.SQL语言实现约束的方法(2)——断言

  (1)断言:一个断言就是一个谓词表达式,表达了希望数据库总能满足的条件

  (2)列约束和表约束是一些特殊的断言

  (3)复杂断言的语法形式

    CREATE ASSERTION CHECK

  (4)当一个断言创建后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言

  (5)断言测试增加了数据库维护的负担,要谨慎使用复杂的断言,但是断言能解决复杂约束

10.断言应用举例

  (1)每笔贷款,要求至少以为借款者账户中存有最低数目的余额,例如1000元

borrower(customer_name, loan_number, ...)  //客户及其贷款(一笔贷款的借款者)
account(account_number, ... ,balance)  //账户及其余额
depositor(account_number, customer_name)    //客户及其账户(借款者的账户)        
loan(loan_number, amount)    //每一笔贷款        

    Create assertion balance_constraint check

    (not exists (

      select * From loan Where not exists (

        Select * From borrower, depositor, account

        Where loan.loan_number = borrower.loan_number

          and borrower.customer_name = depositor.customer_name

          and depositor.account_number = account.account_number

          and account.balance >= 1000)))

相关