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. 获取微信的token工具类

    import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.RedisUtil; impor ...

  2. Typora远程代码执行漏洞 - CVE-2023-2317

    Typora - CVE-2023-2317 简介 Typora一个常用的markdown编辑器,在1.6.7之前存在XSS漏洞,可以通过传入参数触发来加载恶意的JavaScript代码 分析 在ty ...

  3. javacv图片美颜处理,视频美颜处理

    javacv图片美颜处理,视频美颜处理 国产剧明星演戏自带十级滤镜,是众所周知的秘密: 使用opencv也能实现一定的美颜效果: 一.图片美颜 代码 package top.lingkang.test ...

  4. hiveSQL常见专题

    SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...

  5. 第十三部分_awk

    一.awk介绍 1. awk概述 awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具.数据可以来自标准输入.一个或多个文件,或其它命令的输出 ...

  6. 低代码开发不靠谱?看低代码开发在物联网APP开发中的应用

    摘要:云编排式物联APP开发平台可通过云端可视化编排开发,边端远程自动化部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理. 0 引言 当前,物联网技术正在推动人类社会从&quo ...

  7. 华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的应用

    摘要:揭秘高斯 Redis 在IM场景中的应用. 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的应用>,原文作者: ...

  8. 教你用Python 编写 Hadoop MapReduce 程序

    摘要:Hadoop Streaming 使用 MapReduce 框架,该框架可用于编写应用程序来处理海量数据. 本文分享自华为云社区<Hadoop Streaming:用 Python 编写 ...

  9. 华为云VSS漏洞扫描服务之开源组件漏洞检测能力

    摘要:华为云VSS漏洞扫描服务提供针对于Web.主机和软件包的漏洞检测能力. 近日Apache Log4j2漏洞持续发酵,已成为中国互联网2021年年底前最大的安全事件.华为云VSS漏洞扫描服务,提供 ...

  10. 如何使用appuploader制作描述文件​

    如何使用appuploader制作描述文件​ 承接上文我们讲述了怎么制作证书,本文我们来看下怎么制作描述文件吧.​制作描述文件前我们首先我们来添加一个测试设备,后面再制作描述文件. 1.添加测试设备​ ...