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. Java使用HttpUtil.request方法可以发送请求即【Java访问url得到响应数据】

    Java使用HttpUtil.request方法可以发送请求即[Java访问url得到响应数据] 注:这个工具类可以在网上找,也可以自己手写 ,手写的话需要用到以下依赖: <dependency ...

  2. loader编写小记

    此项目在一些大佬的基础上进行了修改,或许能提供一些思路.还在学习中很菜很菜,不足之处还请师傅们多多指点 tips 对shellcode使用AES + Base85加密后以txt保存在远端供下载. 针对 ...

  3. 春秋云镜 - CVE-2022-30887

    多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口,客户是该软件的主要用户.该软件有助于为药房业务创建一个综合数据库,并根据到期. ...

  4. Python——第五章:logging模块

    logging 模块是 Python 中用于记录日志的官方模块.通过 logging 模块,你可以配置和管理日志的生成.处理和存储. logging.basicConfig()用法 filename: ...

  5. springboot-jpa获取session

    springboot获取hibernate的session进行更精细的SQL操作,默认的jpa并不能满足一些复杂需求(可能是我把需求设计复杂了) 通过查看JpaRepository的底层实现,发现是通 ...

  6. 《代码整洁之道 Clean Code》学习笔记 Part 2 - 写出优雅的函数的10条建议

    大师级程序员把系统当作故事来讲,而不是当作程序来写. TLDR 短小(不超过 20 行.缩进不超过 2 层) 只做一件事 保持在同一抽象层级 用多态替代 switch 取个好的函数名 函数参数越少越好 ...

  7. Java开发手册精华总结

    阿里 Java 开发手册的思考总结 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上. -- 毕玄 1. 命名风格 [书摘]类名用 UpperCamelC ...

  8. MySQL基础篇:第九章_详解流程控制结构

    流程控制结构 系统变量 一.全局变量 作用域:针对于所有会话(连接)有效,但不能跨重启 查看所有全局变量 SHOW GLOBAL VARIABLES; 查看满足条件的部分系统变量 SHOW GLOBA ...

  9. 认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

    本文分享自华为云社区<Spring高手之路13--BeanFactoryPostProcessor与BeanDefinitionRegistryPos>,作者: 砖业洋__ . 在Spri ...

  10. 云小课|RDS实例连接又失败?看我祭出杀手锏!

    摘要:自从购买了RDS实例,连接失败的问题就伴随着我,我真是太难了.不要害怕,不要着急,跟着小云妹,读了本文,让你风里雨里,实例连接自此畅通无阻! 顺着以下几个方面进行排查,问题就可以迎刃而解~ 本文 ...