DDL数据定义语言

文章详细介绍了数据库设计中的DDL(DataDefinitionLanguage)三范式,包括1NF(第一范式)、2NF(第二范式)和3NF(第三范式),强调了每个范式的核心目标是减少数据冗余并确保数据完整性。同时,展示了如何在SQL中创建表并添加各种约束,如主键、唯一性、非空、检查和默认值约束,以及如何进行表的修改、删除和外键约束的使用。
摘要由CSDN通过智能技术生成

DDL三范式

简而言之,最终的目的避免数据重复冗余,1NF-->列不可再分最小原子 (避免重复);2NF-->主键依赖(确 定唯一);3NF-->消除传递依赖(建立主外键关联 拆分表);

1NF:

是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个 属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体, 新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一 行只包含一个实例的信息。

2NF:

是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式 (1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分 通常需要为表加上一个列,以存储各个实例的唯一标识。如 emp 表中加上了员工编号(empno) 列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主 关键字或主键、主码。同时要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依 赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个 新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各 个实例的唯一标识。 即第二范式就是非主属性非部分依赖于主键。 也就是说,主属性确定,其他属性唯一确定

3NF:

必须先满足第二范式(2NF)。3NF 要求一个数据库表中不包含已在其它表中已包含的非主关 键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(deptno)、部门名称、地址 等信息。那么员工信息表(emp)中列出部门编号后就不能再将部门名称、部门地址等与部门有关的 信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则 就会有大量的数据冗余。 即第三范式就是属性不依赖于其它非主属性

create 创建表

create table tb_user(
  userid number(5),
  username varchar2(30),
  userpwd varchar2(20),
  age  number(3) ,
  gender char(1 char) ,
  email  varchar2(30),
  regtime date
);

创建表(同时创建约束+默认名称)

create table  tb_user(
  --主键约束
  userid number(5) primary key,
  --非空约束
  username varchar2(30) not null, 
  --检查约束 
  userpwd varchar2(20) check(length(userpwd) between 4 and 18), 
  --默认约束  检查约束
  age number(3) default(18) check(age>=18),
  --默认约束  检查约束
  gender char(3) default('男') check(gender in('男','女')),
  --唯一约束
  email  varchar2(30) unique,
  --默认约束
  regtime date default(sysdate)
);

创建表(同时创建约束+指定名称) 在字段的后面指定约束名直接添加

create table  tb_user(
  --主键约束
  userid number(5) constraint pk_user primary key,
  --非空约束
  username varchar2(30) constraint nameNotNull not null, 
  --检查约束 
  userpwd varchar2(20) constraint ckPwd check(length(userpwd) between 4 and 18), 
  --默认约束  检查约束
  age number(3) default(18) constraint ck_age check(age>=18),
  --默认约束  检查约束
  gender char(3) default('男') check(gender in('男','女')),
  --唯一约束
  email  varchar2(30) unique,
  --默认约束
  regtime date default(sysdate)
);

创建表(同时创建约束+指定名称) 在结构结束之前为当前表中指定字段添加约

create table  tb_user(
  userid number(5),
  username varchar2(30),
  userpwd varchar2(20) constraint nn_user_pwd not null , 
  age number(3) default(18) ,
  gender char(3) default('男'),
  email  varchar2(30),
  regtime date default(sysdate),

  constraint pk_user_id  primary key (userid),
  constraint name_not_null check(username is not null),
  constraint ck_user_name check(length(username)between 4 and 20) , 
  constraint ck_user_pwd check(length(userpwd) between 4 and 18), 
  constraint ck_user_age check(age>=18),
  constraint ck_user_gender  check(gender in('男','女')),
  constraint uq_user_email unique(email)
);

追加约束

--追加约束
alter table tb_user add constraint pk_user_id  primary key (userid);
alter table tb_user add constraint ck_user_name check(length(username)between 4 and 20) ; 
alter table tb_user add constraint ck_user_pwd check(length(userpwd) between 4 and 18); 
alter table tb_user add constraint ck_user_age check(age>=18);
alter table tb_user add constraint ck_user_gender check(gender in('男','女')); 
alter table tb_user add constraint uq_user_email unique(email);
--默认与非空
alter table tb_user modify age default 18;
alter table tb_user modify username not null;

添加外键约束

--外键约束
create table clazz(
    cid number(5)  primary key,
    cname varchar2(30)
)

create table student(
    sid number(5)  primary key,
    sname varchar2(30) not null,
    --所在班级编号
    --外键约束
    -- 1)cid number(5) references clazz(cid)
    --cid number(5) constraint fk_cid references clazz(cid)
    cid number(5)
    --3) constraint fk_cid foreign key(cid) references clazz(cid) 
)
--(4)追加外键约束
alter table student add constraint pk_stu_cid  foreign key(cid) references clazz(cid) ;

追加外键约束之后

--物理约束 : 表结构上为字段添加约束,推荐主外键约束可以定义物理约束

--逻辑约束 : 在后端逻辑代码上添加判断,逻辑,检查等约束建议定义为逻辑约束

表的拷贝

--已有表中拷贝结构
--create table 表名 as select 字段列表 from 已有表 where 1!=1; 
--拷贝结构 emp
create table emp_his as select ename,sal from emp where 1!=1; 
--拷贝结构 emp +数据
create table emp_his2 as select ename,sal from emp where sal>2000;
select * from emp_his2;

drop表的删除

--删除 (先删除从表 再删除主表 ;同时删除约束)
--删除表
drop table emp_his;
--主外键关系下的两张表的删除 : 
     --删除从表 : 直接删除 drop table student
     --删除主表 : 不能直接删除    
            --1)先删除所有从表,再删除主表
            --2)删除主表的同时级联删除主外键约束 drop table clazz cascade constraints;
drop table tb_txt cascade constraints;
drop table tb_user cascade constraints;
drop table student cascade constraints;
drop table clazz cascade constraints;

alter表的修改

1. 修改表名 :rename to 2. 修改列名: alter table 表名 rename column to 3. 修改类型: alter table 表名 modify(字段 类型) 4. 修改约束: 先删除 后添加 5. 添加列: alter table 表名 add 字段 类型 6. 删除列:alter table 表名 drop column 字段

--修改表名
rename tb_txt to tb_txt_new;
--修改列名
alter table tb_txt_new rename column txtid to tid;
--修改类型
alter table tb_txt_new modify(tid varchar2(20));
--添加列
alter table tb_txt_new add col varchar2(30);
--删除列
alter table tb_txt_new drop column col;
select * from tb_txt_new;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值