Oracle表结构&数据类型&约束
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表结构&数据类型&约束的更多相关文章
- SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询
SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...
- oracle表结构和表内容差异比对
oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...
- oracle表结构和表内容差异比对【原】
oracle表结构和表内容差异比对 oracle中有三种集合操作,他们会把左边和右边的select 结果集进行集合操作. union 并集 intersect 交集 minus 差集 假设有如下两张表 ...
- Oracle 表结构、索引以及分区信息查询
Oracle 表结构.索引以及分区信息查询 /* 获取表:*/ select table_name from user_tables; --当前用户的表 select table_name from ...
- Oracle(修改表结构和约束)
目标: 1.添加和修改列 2.添加,enable,disable,或者remove约束 3.删除表 4.删除表中所有数据并回到表定义的初始状态(截断表) 5.修改对象的名字 6.给对象添加注释,从数据 ...
- Oracle 关于定义约束 / 修改表结构 /修改约束
---约束分5种:主键 外键 唯一 非空 检查5类约束 Oracle中分列级别约束 与 表级别约束 列级别约束:在创建表时再列上面加约束 例如: create table table11( stuno ...
- oracle表结构和数据导出时的一些勾选项说明
使用pl/sql developer导出oracle数据库的表结构和表数据时,有一些勾选项供用户选择,需要用户根据实际情况进行勾选或取消. 导出方法如下:一.只导出表结构1.使用pl/sql deve ...
- Oracle表结构转Mysql表结构
1. fnc_table_to_mysql 主体程序 create or replace function fnc_table_to_mysql ( i_owner in string, i_tabl ...
- oracle表结构
表管理 新建表 语法 create table 表名 ( 列名1 类型(长度), 列名2 类型(长度), 列名3 类型(长度) ); create table:关键字,建表 后跟新建表的表名,表名长度 ...
- 【oracle】oracle表结构导出到Word
因为需要写数据库文档,所以需要把数据库里边的表结构在word中用表格列出来,之前一直用powerdesigner,感觉有些麻烦,后来在网上找到了一段sql语句,经测试完全符合我的需求,不敢独享,语句如 ...
随机推荐
- 获取微信的token工具类
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.RedisUtil; impor ...
- Typora远程代码执行漏洞 - CVE-2023-2317
Typora - CVE-2023-2317 简介 Typora一个常用的markdown编辑器,在1.6.7之前存在XSS漏洞,可以通过传入参数触发来加载恶意的JavaScript代码 分析 在ty ...
- javacv图片美颜处理,视频美颜处理
javacv图片美颜处理,视频美颜处理 国产剧明星演戏自带十级滤镜,是众所周知的秘密: 使用opencv也能实现一定的美颜效果: 一.图片美颜 代码 package top.lingkang.test ...
- hiveSQL常见专题
SQL强化 SQL执行顺序 --举例: select a.sex, b.city, count(1) as cnt, sum(salary) as sum1 from table1 a join ta ...
- 第十三部分_awk
一.awk介绍 1. awk概述 awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具.数据可以来自标准输入.一个或多个文件,或其它命令的输出 ...
- 低代码开发不靠谱?看低代码开发在物联网APP开发中的应用
摘要:云编排式物联APP开发平台可通过云端可视化编排开发,边端远程自动化部署,云边协同管理运维的方式,实现物联网APP快速开发,海量边端应用管理. 0 引言 当前,物联网技术正在推动人类社会从&quo ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的应用
摘要:揭秘高斯 Redis 在IM场景中的应用. 本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘第五期:高斯 Redis 在IM场景中的应用>,原文作者: ...
- 教你用Python 编写 Hadoop MapReduce 程序
摘要:Hadoop Streaming 使用 MapReduce 框架,该框架可用于编写应用程序来处理海量数据. 本文分享自华为云社区<Hadoop Streaming:用 Python 编写 ...
- 华为云VSS漏洞扫描服务之开源组件漏洞检测能力
摘要:华为云VSS漏洞扫描服务提供针对于Web.主机和软件包的漏洞检测能力. 近日Apache Log4j2漏洞持续发酵,已成为中国互联网2021年年底前最大的安全事件.华为云VSS漏洞扫描服务,提供 ...
- 如何使用appuploader制作描述文件
如何使用appuploader制作描述文件 承接上文我们讲述了怎么制作证书,本文我们来看下怎么制作描述文件吧.制作描述文件前我们首先我们来添加一个测试设备,后面再制作描述文件. 1.添加测试设备 ...