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. ElasticSearch之Index stats API

    获取指定索引的统计数据. 获取指定索引的全部统计数据,命令样例如下: curl -X GET "https://localhost:9200/testindex_001/_stats?pre ...

  2. 用Python写一个简单的TCP客户端和服务端

    在渗透测试过程中,经常需要创建一个TCP客户端,用来测试服务.发送数据.进行 fuzz 等等.如果黑客潜伏在某大型企业的内网环境中,则不太可能直接获取网络工具或编译器,有时甚至连复制/粘贴或者连接外网 ...

  3. 简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务

    前言 前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受op ...

  4. 2023“强网杯”部分WP

    强网先锋 SpeedUp 题目 我的解答: 分析代码可知是求2的27次方的阶乘的每一位的和. 使用在线网址直接查看:https://oeis.org/A244060/list 然后sha256加密 f ...

  5. 记一次 MySQL timestamp 精度问题的排查 → 过程有点曲折

    开心一刻 下午正准备出门,跟正刷着手机的老妈打个招呼 我:妈,今晚我跟朋友在外面吃,就不在家吃了 老妈拿着手机跟我说道:你看这叫朋友骗缅北去了,tm血都抽干了,多危险 我:那是他不行,你看要是吴京去了 ...

  6. 数据库实践丨MySQL多表join分析

    摘要:在数据库查询中,往往会需要查询多个表的数据,比如查询会员信息同时查询关于这个会员的订单信息,如果分语句查询的话,效率会很低,就需要用到join关键字来连表查询了. Join并行 Join并行1. ...

  7. 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了

    摘要:充电团聚云上见,顺便攒攒压岁钱. 春!节!倒!计!时!啦! 农历新年即将到来,热闹的过年氛围逐渐弥漫,华为云社区先给大家拜个早年,祝所有小伙伴们新春快乐,牛年大吉! 回望2020年,社区涌现了许 ...

  8. 云小课|教你如何使用RDS for PostgreSQL插件

    摘要:本文介绍RDS for PostgreSQL支持的插件及不同插件的创建.删除或使用方法. 本文分享自华为云社区<[云小课][第42课]RDS for PostgreSQL插件介绍>, ...

  9. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  10. Bug定级实例

    *1级,**系统崩溃* *定义:*严重阻碍测试和开发工作 *对应**优先级**:**最高* *具体可分为:* 1.功能完全没有实现 2.应用闪退/崩溃无法运行 3*.应用必现安全模式,无法运行* 4. ...