4.SQL语句之二维表创建以及主键约束、非空约束、检查约束、唯一约束、外键约束

二维表创建

创建表  使用create table 表名(字段名 类型,字段名 类型,...)
数据类型
    number类型(数值类型)
        整数类型 number(a)  总长度为a
        浮点数类型 number(a,b)  总长度为a,小数长度为b,小数位可以不写
    varchar2类型(字符类型)
        varchar2(ln)   ln表示字符的最大长度,实际存储内存长度根据字符大小自动分配,但最大长度不能超过ln
                        特点:动态分配存储空间,节省空间
    char类型 (字符类型)
        char(ln) 不管字符数据长度多大,直接开辟ln大小的空间存储数据
                     特点:存储效率高于varchar2
   日期类型  

        date  保存日期和时间,在数据库中的存储固定为7个字节

        timestap  与date的区别是不仅可以保存日期和时间,还能保存小数秒。数据库内部用7或者11个字节存储,如果精度为0,

                         则用7字节存储,与date类型功能相同,如果精度大于0则用11字节存储

  大文本类型

        BLOB:二进制大对象,存储在数据库里的大对象,一般是图像声音等文件。

        CLOB: 字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。


二维表创建约束

主键约束

主键特点: 非空唯一,用来标识一条数据

1.直接在创建表的字段后使用primary key

2.在创建表的语句的最后面使用 constraints pk_表名_字段名 primary key(字段名);

3.在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);

删除主键   alter table 表名 drop constraints (主键约束名)pk_表名_字段名;

非空约束

 

1.直接在创建表的字段后使用not null关键字

2.在创建表的语句的最后面使用 constraints ck_表名_字段名 check (字段名 is not null);

3.在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check (字段名 is not null);

删除非空约束   alter table 表名 drop constraints (非空约束名)ck_表名_字段名 check (字段名 is not null);

检查约束

 

1.直接在创建表的字段后使用check(条件)  比如 sage number(3) check(sage<150 and sage>0);

2.在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件);

3.在创建表后使用 alter table 表名 add constraints ck_表名_字段名 check (条件);

删除检查约束  alter table 表名 drop constraints (检查约束名)ck_表名_字段名 check (条件); 

唯一约束

1.直接在创建表的字段后使用unique  比如 sqq varchar2(30) unique;

2.在创建表的语句的最后面使用 constraints un_表名_字段名 check(条件);

3.在创建表后使用 alter table 表名 add constraints un_表名_字段名 unique(字段名);

删除检查约束  alter table 表名 drop constraints (唯一约束名)un_表名_字段名 unique(字段名);

 通过上面的学习,我们已经可以创建一个较为完整的student表,如下所示。

create table student(
       sno number(10) primary key,  --主键约束
       sname varchar2(100) not null, --非空约束
       sage number(3) check(sage>0 and sage<150),  --检查约束
       ssex char(4) check(ssex='男' or ssex='女'), --检查约束
       sfav varchar2(500) ,
       sbirth date,
       sqq varchar2(30) unique  --唯一约束
       cid number(10) references clazz(cno)  --外键约束  下文要讲
)

外键约束

  注意到上文中创建的student表中的cid字段是一个外键约束,通过外键约束使得student表和下面的clazz表联系起来。

create table clazz(
       cno number(10) primary key,
       cname varchar2(100) not null,
       cdesc varchar2(500)
)

那么什么是外键约束呢?

概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束
            其中主动依赖的表称为子表,被依赖的表称为父表外键加在子表中

作用:当在子表中插入的数据在父表中不存在,则会自动报错

1.在子表的字段后直接使用 references 父表名(字段名) 例如 cid number(10) reference clazz(cno);

2.在创建表语句的最后面使用 constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)

3.在创建表后使用 alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)

删除外键约束  alter table 表名 drop constraints (外键约束名)fk_子表名_字段名

外键选取:  一般选取父表的主键作为子表的外键
外键缺点:无法直接删除父表数据,除非进行级联删除

    级联删除:
            使用:在添加外键约束时,使用关键字 on delete cascade
            作用:当删除父表数据时,自动删除子表相关所有数据
            缺点:无法保留子表历史数据

           使用:在添加外键约束时,使用关键字 on delete set null
           作用:删除父表数据时,将字表中的依赖字段的值设置为null
           注意:子表依赖字段不能添加非空约束

 

实际开发时解决方法:

  • 能不用外键就不用外键,实在需要外键时再使用
  • 1.删除数据时可以先接触外键约束,删除完成后,再添加上外键约束
  • 2.不让客户填写信息,而是进行信息选择。例如一共就两个班,学生在填写信息时下拉选择即可

你可能感兴趣的:(数据库oracle,Mysql)