1、Oracle 表结构

1.1、创建表名的规范

  • 推荐以"t_xxx"
  • 不能含有"+- "等非法字符,eg:sql create table "t-1" (id int);
  • 不能以"_"开头,eg:sql create table "_t" (id int);
  • 表名如果不用"",那么全部大写,如果"",严格区分大小写,T_USER和t_user是两个不同的表对象

1.2、查看当前用户所拥有的表

当前用户*

select * from user_tables;

DBA角色

select * from dba_users;

这种以dba_xxx或者user_xxx的数据对象,我们一般称作数据字典!

1.3重命名表

alter table t_user rename to t_student;

rename t_student to t_user;

1.4、重命名列

注意:user是关键字,不要作为表名、列名,如果一定要这么定义,使用""

alter table t_user rename column name to "user";

1.5、添加列

alter table t_user add gender char(1);
alter table t_user add (mail varchar(50), addr varchar(50));

1.6、修改列类型

alter table t_user modify "user" varchar(5);

alter table t_user modify ("user" varchar(15), mail varchar(60));

1.7、删除列

alter table t_user drop column addr;
alter table t_user drop (id, mail);

1.8、表名注释

comment on table t_user is 'user info';
select * from user_tab_comments;

1.9、列名注释

comment on column t_user."user" is 'user real name';
select * from user_col_comments where table_name = 'emp';

1.10、授予其他用户可以修改我的表的表结构权限

grant alter on t_user to pp0419;

2、Oracle 数据类型

2.1、字符

char(2000)

​ 2000个字节(2000个英文,666个汉字——utf8,1000个汉字——gbk)

nchar(1000)

​ 1000个字符(1000个英文,1000个汉字——utf8,1000个汉字——gbk)

varchar2(4000)

​ 4000个字节 (4000个英文,1333个汉字——utf8,2000个汉字——gbk)

nvarchar2(2000)

​ 2000个字符(2000个英文,2000个汉字——utf8,2000个汉字——gbk)

char和nchar是固定长度存储(不足会自动补齐你指定的长度)

varchar和nvarchar是可变长度存储(按实际字符串长度存储)

n表示按字符存储(不加n按字节存储)

drop table t_user;

-- create table t_user (name char(10));        --
-- create table t_user (name nchar(10)); --
-- create table t_user (name varchar2(10)); --
create table t_user (name nvarchar2(10)); -- insert into t_user values ('Tom');
insert into t_user values ('我们'); select * from t_user; select length(name) from t_user; -- 字符长度

2.2、数值

int/long 存整数

number/float 存小数

number(m, n) 存指定精度的小数

number(5, 2) [-999.99, 999.99]

insert into t_user values (-999.99);
insert into t_user values (999.99);
insert into t_user values (-999.945); -- -999.95
insert into t_user values (-999.995); -- 超出精度

number(5, -2)

create table t_user (salary number(5, -2));

insert into t_user values (12345.99);    -- 12300
insert into t_user values (12355.99); -- 12400

注意:没有double!

2.3、时间日期

date 年月日时分秒

timestamp 年月日时分秒毫秒

create table t_user (birth date);
insert into t_user values (sysdate); create table t_user (birth timestamp);
insert into t_user values (systimestamp);

2.4、二进制

blob binary large object

​ 可以含有图片、影像、文本数据

clob character large object

​ 只能含有文本数据

没有长度限制

3、Oracle 约束

3.1、主键 primary key

唯一约束 + 非空约束

一个表上只能有一个主键

drop table t_user;

create table t_user (
-- id int primary key,
id int constraint pk_id primary key,
name varchar(20)
); create table t_user (
id int,
name varchar(20),
-- primary key(id)
constraint pk_id primary key(id)
); alter table t_user add primary key (id); alter table t_user drop primary key;
alter table t_user drop constraint pk_id;

3.2外键 foreign key

只能引用别人表的主键列或者是有唯一约束的列

drop table t_user cascade constraints;      -- 删除主表的同时删除引用本表主键的外键约束(但是外键数据还在)

drop table t_contact;

-- 用户
create table t_user (
id int primary key,
name varchar(20)
); -- 监护人
create table t_contact (
id int primary key,
name varchar(20),
-- user_id int references t_user(id)
user_id constraint fk_user_id references t_user(id)
); create table t_contact (
id int primary key,
name varchar(20),
user_id int,
constraint fk_user_id foreign key(user_id) references t_user(id)
); alter table t_contacts add constraint fk_user_id foreign key (userid) references t_user (id); alter table t_contact drop constraint fk_user_id;

技巧:删除主键时级联删除外键数据或修改外键值为null

在MySQL也有类似的级联删除外键的操作!!!

drop table t_user cascade constraints;      -- 删除主表的同时删除引用本主键的外键约束(但是外键数据还在)

drop table t_contact;

-- 用户
create table t_user (
id int primary key,
name varchar(20)
); -- 监护人
create table t_contact (
id int primary key,
name varchar(20),
user_id int references t_user(id)
-- on delete cascade -- 级联删除外键数据行
on delete set null -- 外键数据行保留,把外键值改为null
); insert into t_user values (111, 'tom');
insert into t_user values (112, 'sam');
insert into t_user values (113, 'john'); insert into t_contact values (1, 'ben', 111);
insert into t_contact values (2, 'mike', 111);
insert into t_contact values (3, 'sophia', 112); delete from t_user where id = 111; select * from t_contact;

3.3、组合主键/组合外键(了解)

create table t_user (
id int,
name varchar2(10),
gender char(1),
primary key(id, name) -- id和name值的组合不能重复,且两个列都不能为null
); create table t_contact (
name varchar2(10),
cid int,
cname varchar2(10),
constraint cfk_cid_cname foreign key (cid, cname) references t_user(id, name)
);

3.4、唯一 unique

一个表中可以有多个列定义唯一约束

唯一约束的值可以为null

唯一可以被外键引用(因为有时主键已被其他列定义)

create table t_user (
id int primary key,
-- name varchar2(10) unique
/*
name varchar2(10),
unique(name)
*/
-- constraint uq_name unique(name)
); alter table t_user add constraint uq_name unique(name);

3.5、组合唯一

create table t_user (
id int,
name varchar2(10),
gender char(1),
unique(id, name) -- id和name值的组合不能重复,但是某个列可以为null
);

3.6、非空 not null

不需要使用constraint关键字去创建(直接通过表结构就可以定义了)

-- 直接通过表结构定义或修改
create table t_user (
id int primary key,
name varchar(20) not null
); alter table t_user modify name varchar(10) null; -- 通过constraint约束形式
create table t_user (
id int primary key,
name varchar(20) constraint not_null_name not null
); alter table t_user drop constraint not_null_name; desc t_user;

3.7、检查 check

check(SQL表达式)

可以对值的大小、范围、引用都可以进行限定

create table t_user (
id int,
name varchar(10),
mobile varchar(11),
-- check(length(mobile) = 11)
constraint ck_mobile check(length(mobile) = 11)
);
create table t_user (
id int,
name varchar(10),
-- gender char(1) check(gender in ('M', 'F'))
-- age int check(age between 18 and 30)
-- age int check(age >= 18 and age <= 30)
-- mobile char(11) check(mobile like '1%') -- 注意定长不适用于length检查
mobile varchar(11) check(length(mobile) = 11)
);

检查引用关系的写法

create table t_user (
id int,
name varchar(10),
hiredate date, -- 入职时间
firedate date, -- 离职时间
-- firedate date check(firedate >= hiredate) -- ERROR
constraint ck_firedate check(firedate >= hiredate) -- 雇员的离职时间(不能定义为行内约束写法,必须新行定义)
);

注意:针对于一个列可以同时存在多个检查约束(注意约束之间可能有冲突)

create table t_user (
age int check (age between 18 and 40)
); alter table t_user add constraint ck_age check (age between 16 and 30); select * from user_constraints where table_name = 'T_USER'; insert into t_user values (31); -- ERROR

默认 default

create table t_user (
id int,
name varchar(10) default 'unknown'
); insert into t_user values (1, 'tom');
insert into t_user values (2, '');
insert into t_user values (3, null);
insert into t_user (id) values (4);
insert into t_user values (5, default); select * from t_user; alter table t_user modify name varchar(10) default null; -- 取消默认约束
insert into t_user (id) values (6);

3.8、数据字典(约束相关)

select * from user_constraints;

CONSTRAINT_TYPE 列存储的就是约束类型:

C - 检查

P - 主键

R - 外键

U - 唯一

CONSTRAINT_NAME 列存储的就是约束名!

select * from user_constraints where table_name = 'T_USER';

alter table t_user drop constraint SYS_C00111;

采用约束实现三大关联关系

1. 1:1

-- 身份证和护照(有身份证不一定有护照,但是有护照一定有身份证)

create table t_idcard (
id char(18) primary key,
name varchar(20) not null,
gender char(1) not null
); create table t_passport (
id char(15) primary key,
name varchar(50) not null,
idcard char(18),
constraint fk_idcard foreign key (idcard) references t_idcard(id), -- 外键定义在护照这张表
constraint uq_idcard unique(idcard) -- 唯一关系实现1对1
);

2. 1:M

只要有外键就是多的引用关系

3. M:N

-- 学生选课

create table t_student (
sid int primary key,
sname varchar2(20) not null
); create table t_course (
cid int primary key,
cname varchar2(10) not null
); create table r_student_course (
rsid int,
rcid int,
constraint fk_rsid foreign key (rsid) references t_student(sid),
constraint fk_rcid foreign key (rcid) references t_course(cid),
unique(rsid, rcid) -- 不能重复选课
);

Oracle表结构&数据类型&约束的更多相关文章

  1. SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询

    SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...

  2. oracle表结构和表内容差异比对

    oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...

  3. oracle表结构和表内容差异比对【原】

    oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...

  4. Oracle 表结构、索引以及分区信息查询

    Oracle 表结构.索引以及分区信息查询 /* 获取表:*/ select table_name from user_tables; --当前用户的表 select table_name from ...

  5. Oracle(修改表结构和约束)

    目标: 1.添加和修改列 2.添加,enable,disable,或者remove约束 3.删除表 4.删除表中所有数据并回到表定义的初始状态(截断表) 5.修改对象的名字 6.给对象添加注释,从数据 ...

  6. Oracle 关于定义约束 / 修改表结构 /修改约束

    ---约束分5种:主键 外键 唯一 非空 检查5类约束 Oracle中分列级别约束 与 表级别约束 列级别约束:在创建表时再列上面加约束 例如: create table table11( stuno ...

  7. oracle表结构和数据导出时的一些勾选项说明

    使用pl/sql developer导出oracle数据库的表结构和表数据时,有一些勾选项供用户选择,需要用户根据实际情况进行勾选或取消. 导出方法如下:一.只导出表结构1.使用pl/sql deve ...

  8. Oracle表结构转Mysql表结构

    1. fnc_table_to_mysql 主体程序 create or replace function fnc_table_to_mysql ( i_owner in string, i_tabl ...

  9. oracle表结构

    表管理 新建表 语法 create table 表名 ( 列名1 类型(长度), 列名2 类型(长度), 列名3 类型(长度) ); create table:关键字,建表 后跟新建表的表名,表名长度 ...

  10. 【oracle】oracle表结构导出到Word

    因为需要写数据库文档,所以需要把数据库里边的表结构在word中用表格列出来,之前一直用powerdesigner,感觉有些麻烦,后来在网上找到了一段sql语句,经测试完全符合我的需求,不敢独享,语句如 ...

随机推荐

  1. 复现YOLO5所遇到的问题

    一. 解决方案: 由于没有影响模型继续运行,理解为简单的warning.根据查询问题,推断是由于 pytorch和torchvision的版本原因导致的. 二. 解决方案: 由于没有影响模型继续运行, ...

  2. 【C# 技术】C# 常用排序方式

     前言  在最近的项目中经常会对C#中的数据进行排序,对于基本数据类型,其排序方式比较简单,只需要调用内置算法即可实现,但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦,所以在本文章中将 ...

  3. C语言之输出孪生素数

    1.题目内容: 孪生素数是指间隔为 2 的相邻素数,例如最小的孪生素数对是3和5,5和7也是(5虽重复但算作2组). 2.输入格式: 输入N,找出2至N之间的孪生素数的组数. 这里要注意输入的N不要超 ...

  4. Shiro 的基本使用

    简介 Apache Shiro 是一个强大的.灵活的开源安全框架,可以干净地处理验证.授权.企业会话管理和加密等功能 相关特性 Apache Shiro 具有的主要特性如下图所示: 主要关注的地方在于 ...

  5. UnionFind 并查集

    简介 UnionFind 主要用于解决图论中的动态联通性的问题(对于输入的一系列元素集合,判断其中的元素是否是相连通的). 以下图为例: 集合[1, 2, 3, 4] 和 [5, 6]中的每个元素之间 ...

  6. 【开源】EDUCN网站

    EDUCN https://scrc.rth1.link/ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q ...

  7. 三步实现BERT模型迁移部署到昇腾

    本文分享自华为云社区 <bert模型昇腾迁移部署案例>,作者:AI印象. 镜像构建 1. 基础镜像(由工具链小组统一给出D310P的基础镜像) From xxx 2. 安装mindspor ...

  8. 开发老人笔记:Git 常用命令清单

    摘要:git是目前世界上最先进的分布式版本控制系统. 多人协作 master:此分支用来发布稳定的代码,合并一般是由管理员合并 dev:此分支用于团队开发,团队成员向此分支提交代码 bug:此分支用于 ...

  9. KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书

    摘要:本文将基于KubeEdge项目详细分析云原生边缘计算业务过程的威胁模型并给出对应的安全加固建议. 本文分享自华为云社区<KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书> ...

  10. 教你3种Kafka的指定副本作为Leader的实现方式

    摘要:因为在我们实际的运维过程中,需要指定某个副本为ISR,但是Kafka中的Leader选举策略并不支持这个功能,所以需要我们自己来实现它. 本文分享自华为云社区<Kafka的指定副本作为Le ...