SQL语法(八) 表及其约束

版权声明:程序猴jwang版权所有 https://blog.csdn.net/qq_21046965/article/details/82560720

 

前言

            本章将学习用户表的使用。

范例

1.创建表

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

create table student(
      sno number(10),
      sname varchar2(100),
      sage number(3),
      ssex char(100),
      sfav varchar2(500),
      sbirth date   
)

2.表和约束

(1)主键约束

添加主键,主键特点:非空唯一
       --使用:
            --直接在创建表的字段后使用 primary key
            --在创建表的语句的最后面使用 constraints pk_表名_字段名 primary key(字段名)
            --在创建表后使用 alter table 表名 add  constraints pk_表名_字段名 primary key(字段名);
            --删除主键     alter table student drop  constraints 主键的约束名;

create table student(
    sno number(10),--primary key
    sname varchar2(100) ,
    sage number(3), 
    ssex char(4) ,
    sfav varchar2(500),
    sbirth date,
    sqq varchar2(30)
    --constraints pk_student_sno primary key(sno)--添加主键约束
)
--alter table student add  constraints pk_student_sno primary key(sno); 
--alter table student drop  constraints pk_student_sno;

在添加主键约束字段的表中,若插入的数据中该字段的值是null或者重复,将会违反约束条件。以下sql将报错。

insert into student(sname,sage) values ('关晓彤',11);
insert into student values(null,'关晓彤',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');

insert into student values(1,'关晓彤',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
insert into student values(1,'关晓彤001',18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');

(2)非空约束

使用非空约束
       --使用:
            --直接在创建表的字段后使用 not null 关键字 
            --在创建表的语句的最后面使用 constraints ck_表名_字段名 check(字段名 is not null)
            --在创建表后使用 alter table 表名 add  constraints ck_表名_字段名 check(字段名 is not null);
            --删除非空约束 alter table student drop  constraints 非空约束名;

create table student(
   sno number(10) ,
   sname varchar2(100) ,--not null
   sage number(3),
   ssex char(4) ,
   sfav varchar2(500),
   sbirth date,
   sqq varchar2(30)
   --constraints ck_student_sname check(sname is not null)--非空约束
)
--alter table student add  constraints ck_student_sname check(sname is not null);
--alter table student drop  constraints ck_student_sname; 

在添加非空约束字段的表中,若插入的数据中该字段的值是null,将会违反约束条件。以下sql将报错。

insert into student values(1,null,18,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');

(3)检查约束

使用检查约束
            --直接在创建表的字段后使用 check(条件) 例如      sage number(3) check(sage<150 and sage>0),
            --在创建表的语句的最后面使用 constraints ck_表名_字段名 check(条件)
            --在创建表后使用 alter table 表名 add  constraints ck_表名_字段名 check(条件);
            --删除检查约束 alter table student drop  constraints 检查约束名;

create table student(
     sno number(10) ,
     sname varchar2(100) ,
     sage number(3), --check(sage<150 and sage>0)
     ssex char(4) ,--check(ssex='男' or ssex='女')
     sfav varchar2(500),
     sbirth date,
     sqq varchar2(30)
     --constraints ck_student_sage check(sage<150 and sage>0)--检查约束
     --constraints ck_student_ssex check(ssex='男' or ssex='女')--检查约束
)

--alter table student add constraints ck_student_sage check(sage<150 and sage>0)
--alter table student drop  constraints ck_student_sage;
 
--alter table student add constraints ck_student_ssex check(ssex='男' or ssex='女')
--alter table student drop  constraints ck_student_ssex;

在添加检查约束字段的表中,若插入的数据中该字段的值是不符合要求,将会违反约束条件。以下sql将报错。

insert into student values(3,'关晓彤002',300,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
insert into student values(4,'关晓彤',18,'a','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');

(4)唯一约束

使用唯一约束
            --直接在创建表的字段后使用 unique
            --在创建表的语句后面使用 constraints un_表名_字段名 unique(字段名);
            --在创建表后使用 alter table 表名 add  constraints un_表名_字段名 unique(字段名);
            --删除约束:alter table 表名 drop  constraints 唯一约束名;

create table student(
   sno number(10) ,
   sname varchar2(100) ,
   sage number(3),
   ssex char(4) ,
   sfav varchar2(500),
   sbirth date,
   sqq varchar2(30) --unique
   --constraints un_student_sqq unique(sqq)--唯一约束
)
--alter table student add constraints un_student_sqq unique(sqq);
--alter table student drop  constraints un_student_sqq ; 

在添加唯一约束字段的表中,若插入的数据中该字段的值是重复的,将会违反约束条件。以下sql将报错。 

insert into student values(3,'关晓彤002',300,'女','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');
insert into student values(4,'关晓彤',18,'a','拍电影',to_date('2000-01-01','yyyy-mm-dd'),'267889900');

(5)外键约束

使用外键:
      --作用:当在子表中插入的数据在父表中不存在,则会自动报错。
      --概念:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束。
             --其中主动依赖的表称为子表,被依赖的表称为父表。外键加在子表中。
      --使用: 
             --在子表中的字段后直接使用   references 父表名(字段) 例如: cid number(10) references clazz(cno)
             --在创建表语句的最后面使用  constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
             --在创建表后使用:alter table 表名 add constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
            --删除外键:alter table 表名 drop constraints 外键约束名
      --外键选取:
            --一般选取父表的主键作为子表的外键。
      --外键的缺点:
            --无法直接删除父表数据,除非级联删除
            --级联删除:在添加外键约束时,使用关键字 on delete cascade
                     --使用:当删除父表数据时,自动删除子表相关所有数据。
                     --缺点:无法保留子表历史数据。
                     --使用关键字 on delete set null
                           --删除父表数据时,将子表中的依赖字段的值设置为null。
                           --注意:子表依赖字段不能添加非空约束。

--创建学生表
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),
   sqq varchar2(30) unique,
   cid number(10) --references clazz(cno)
   --constraints fk_student_cid foreign key(cid) references clazz(cno)--外键
)
--添加外键
alter table student add constraints fk_student_cid foreign key(cid) references clazz(cno)
alter  table student drop constraints fk_student_cid 

--添加测试数据
insert into student values(1,'张三001',18,'男','唱歌','657889900',1);
insert into student values(2,'张三002',18,'男','唱歌','657889901',1);
insert into student values(3,'李四001',18,'男','唱歌','657889903',2);
insert into student values(4,'李四002',18,'男','唱歌','657889904',2);
--创建班级表
create table clazz(
   cno number(10) primary key,
   cname varchar2(100) not null,
   cdesc varchar2(300)
)
--添加测试数据
insert into clazz values(1,'java高薪就业班','6666');
insert into clazz values(2,'python高薪就业班','33333');

无法直接删除父表数据,会报违反约束的错误。

猜你喜欢

转载自blog.csdn.net/qq_21046965/article/details/82560720