Oracle数据库的应用详解
一、创建表
语法
CREATE TABLE schema_name.table_name (column_1 data_type column_constraint,column_2 data_type column_constraint,...table_constraint);
首先,在
CREATE TABLE
子句上,指定新表所属的表名和模式名。其次,列出括号内的所有列。如果表有多列,则需要用逗号分隔每个列定义。列定义包括列名称后面它的数据类型例如
NUMBER
,VARCHAR2
和列约束如NOT NULL
,主键,检查。第三,如果适用,您可以添加表约束,例如,主键,外键,检查。
但是也需要注意,创建表也需要授权。
eg
CREATE TABLE ot.persons(person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,first_name VARCHAR2(50) NOT NULL,last_name VARCHAR2(50) NOT NULL,PRIMARY KEY(person_id)
);
该person_id
是标识列,它标识表中的唯一行。person_id
列的数据类型是NUMBER
。该子句GENERATED BY DEFAULT AS IDENTITY
指示Oracle生成一个新整数,并在每次向表中插入新行时将其用于该列。(这个12C才有的功能)
二、修改表
语法
ALTER TABLE table_name action;
首先,指定要修改的表名。
其次,指示要在表名后执行的操作。
操作形式
添加一个或多个列
修改列定义
删除一列或多列
重命名列
重命名表
1 添加新列
ALTER TABLE table_name
ADD column_name type constraint;
eg
ALTER TABLE persons
ADD birthdate DATE NOT NULL;
要同时向表中添加多个列,请将新列放在括号内
语法
ALTER TABLE table_name
ADD (column_name type constraint,column_name type constraint,...
);
eg
ALTER TABLE persons
ADD (phone VARCHAR(20),email VARCHAR(100)
);
2 修改列的属性
语法
ALTER TABLE table_nameMODIFY column_name type constraint;
eg
ALTER TABLE persons MODIFY birthdate DATE NULL;
要修改多个列
语法
ALTER TABLE table_nameMODIFY ( column_1 type constraint,column_1 type constraint,...);
eg
ALTER TABLE persons MODIFY(phone VARCHAR2(20) NOT NULL,email VARCHAR2(255) NOT NULL
);
3 删除现有列
语法
ALTER TABLE table_name
DROP COLUMN column_name;
eg
ALTER TABLE persons
DROPCOLUMN birthdate;
要同时删除多个列,请使用以下语法:
ALTER TABLE table_name
DROP (column_1,column_2,...);
eg
ALTER TABLE persons
DROP( email, phone );
4 表重命名
语法
ALTER TABLE table_name
RENAME TO new_table_name;
eg
ALTER TABLE persons RENAME TO people;
三、约束
什么是约束?
两个或多个实体或实体建模体之间的几何特征的界限(wiki)。
对于表中数据的限定或者,多表之间的数据关系的一种限定。
主键约束
外键约束
唯一约束
检查约束
非空约束
1 主键约束
主键是表中列的组合列,用于唯一标识表中的行。
规则
主键列不能包含NULL值或空字符串。
主键值在整个表中必须是唯一的。
不应随时间更改主键值。
主键建议:
首先,主键应该没有意义。有时,您可能希望为主键使用有意义的数据,例如社会安全号码(SSN),车辆识别号码(VIN),电子邮件和电话号码。但是,您不知道电子邮件或电话号码何时更改或被其他人重复使用。在这种情况下,它会产生许多数据问题。在数据库世界中,人工密钥被称为代理密钥,它与自然主密钥相对。
其次,主键应该是紧凑的。主键通常是数字键,因为Oracle通常比任何其他数据类型更快地处理数字(项目复杂,可能会采用非数字)。
尽管在Oracle中不是必需的,但在每个表中都有一个主键被认为是最佳实践。
eg
CREATE TABLE purchase_orders (po_nr NUMBER PRIMARY KEY,vendor_id NUMBER NOT NULL,po_status NUMBER(1,0) NOT NULL,created_at TIMESTAMP WITH TIME ZONE NOT NULL
);
也可以在列声明完毕后,最后指定
CREATE TABLE purchase_orders (po_nr NUMBER,vendor_id NUMBER NOT NULL,po_status NUMBER(1,0) NOT NULL,created_at TIMESTAMP WITH TIME ZONE NOT NULL,CONSTRAINT pk_purchase_orders PRIMARY KEY(po_nr)
);
联合主键
CREATE TABLE purchase_order_items (po_nr NUMBER NOT NULL,item_nr NUMBER NOT NULL,product_id NUMBER NOT NULL, quantity NUMBER NOT NULL,purchase_unit NUMBER NOT NULL,buy_price NUMBER (9,2) NOT NULL,delivery_date DATE,PRIMARY KEY (po_nr, item_nr)
);
如果某表没有设置主键,现在要设置
ALTER TABLE table_name
ADD CONSTRAINT constraint_name
PRIMARY KEY (column1, column2, ...);
删除主键约束
ALTER TABLE table_name
DROP CONSTRAINT primary_key_constraint_name;
更简洁的做法是
ALTER TABLE table_name
DROP PRIMARY KEY;
启用和禁用主键
要在将大量数据加载到表中或更新海量数据时提高性能,可以暂时禁用PRIMARY KEY
约束。
ALTER TABLE table_name
DISABLE CONSTRAINT primary_key_constraint_name;
或者
ALTER TABLE table_name
DISABLE PRIMARY KEY;
启用主键
ALTER TABLE table_name
ENABLE CONSTRAINT primary_key_constraint_name;
或者
ALTER TABLE table_name
ENABLE PRIMARY KEY;
2 外键约束
假设我们有两个表supplier_groups
和suppliers
CREATE TABLE supplier_groups(group_id NUMBER GENERATED BY DEFAULT AS IDENTITY,group_name VARCHAR2(255) NOT NULL,PRIMARY KEY (group_id)
);CREATE TABLE suppliers (supplier_id NUMBER GENERATED BY DEFAULT AS IDENTITY,supplier_name VARCHAR2(255) NOT NULL,group_id NUMBER NOT NULL,PRIMARY KEY(supplier_id)
);
该supplier_groups
表存储供应商组,例如,一次性供应商,第三方供应商和供应商间供应商。每个供应商组可能有零个,一个或多个供应商。该suppliers
表存储供应商信息。每个供应商必须属于供应商组。
supplier_groups
和suppliers
表之间的关系是一对多的。换句话说,一个供应商组有许多供应商,而每个供应商必须属于供应商组。在向表中插入行之前suppliers
,必须在表中查找现有group_id
行supplier_groups
并使用此值进行插入。
测试数据
INSERT INTO supplier_groups(group_name)
VALUES('One-time Supplier');INSERT INTO supplier_groups(group_name)
VALUES('Third-party Supplier');INSERT INTO supplier_groups(group_name)
VALUES('Inter-co Supplier');
要插入新的第三方供应商
INSERT INTO suppliers(supplier_name, group_id)
VALUES('Toshiba',1);
但是如果插入了组id为4的呢?
解决此问题的解决方案是使用Oracle外键约束来强制执行来自supplier_groups
和suppliers
表的行之间的关系。
DROP TABLE suppliers;
CREATE TABLE suppliers (supplier_id NUMBER GENERATED BY DEFAULT AS IDENTITY,supplier_name VARCHAR2(255) NOT NULL,group_id NUMBER NOT NULL,PRIMARY KEY(supplier_id),FOREIGN KEY(group_id) REFERENCES supplier_groups(group_id)
);
当有了外键的约束之后,就无法随意的插入这些无效数据了。
创建外键
语法
CREATE TABLE child_table (...CONSTRAINT fk_nameFOREIGN KEY(col1, col2,...) REFERENCES parent_table(col1,col2) ON DELETE [ CASCADE | SET NULL ]
);
首先,要为外键约束显式指定名称,请使用CONSTRAINT
后跟名称的子句。该CONSTRAINT
条款是可选的。如果省略它,Oracle将为外键约束分配系统生成的名称。
其次,指定FOREIGN KEY
子句将一个或多个列定义为外键和父表,其中包含外键列引用的列。
第三,使用该ON DELETE
子句指定父表中的行被删除时的结果。
ON DELETE CASCADE
:如果删除父级中的行,则将删除子表中引用该行的所有行。ON DELETE SET NULL
:如果删除父级中的行,则对于外键列,子表引用该行的所有行都将设置为NULL。
与主键约束不同,表可能具有多个外键约束。
如果是修改表添加外键
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (col1,col2) REFERENCES child_table (col1,col2);
删除外键
ALTER TABLE child_table
DROP CONSTRAINT fk_name;
禁用外键
ALTER TABLE child_table
DISABLE CONSTRAINT fk_name;
启用外键
ALTER TABLE child_table
ENABLE CONSTRAINT fk_name;
3 检查约束
Oracle检查约束允许您通过限制一列或多列接受的值来强制域完整性。
要创建检查约束,请定义返回true或false的逻辑表达式。Oracle使用此表达式来验证正在插入或更新的数据。如果表达式的计算结果为true,则Oracle接受数据并进行插入或更新。否则,Oracle将拒绝该数据,并且根本不会插入或更新。
可以将检查约束应用于列或列组。列可以具有一个或多个检查约束。
语法
CREATE TABLE table_name (...column_name data_type CHECK (expression),...
);
如果要为检查约束指定显式名称,请使用以下CONSTRAINT
子句
CONSTRAINT check_constraint_name
CHECK (expression);
eg
CREATE TABLE parts (part_id NUMBER GENERATED BY DEFAULT AS IDENTITY,part_name VARCHAR2(255) NOT NULL,buy_price NUMBER(9,2) CHECK(buy_price > 0),PRIMARY KEY(part_id)
);
下面的语句将会报错
INSERT INTO parts(part_name, buy_price)
VALUES('HDD',0);
为了更好地分析错误消息并稍后引用约束,您可以为检查约束提供显式名称:
DROP TABLE parts;CREATE TABLE parts (part_id NUMBER GENERATED BY DEFAULT AS IDENTITY,part_name VARCHAR2(255) NOT NULL,buy_price NUMBER(9,2) CONSTRAINT check_positive_buy_price CHECK(buy_price > 0),PRIMARY KEY(part_id)
);
再次插入
INSERT INTO parts(part_name, buy_price)
VALUES('Screen',-100);
报错信息就更加容易明白是什么原因。
修改表添加检查约束
-- 添加一列
ALTER TABLE parts
ADD cost NUMBER(9,2);
ALTER TABLE parts
ADD CONSTRAINT check_positive_cost CHECK (cost > 0);
删除与禁用启用同上。
检查约束的限制
您可以仅为表定义检查约束,而不是视图。
检查约束的表达式可以引用表中的任何列,但它不能引用其他表的列。
表达式也不能包含以下结构之一:
非确定性的功能,如
SYSDATE
,currdate和CURRENT_TIMESTAMP
。子查询或标量子查询表达式。
调用任何用户定义的函数。
嵌套表列或属性。
伪列
CURRVAL
,NEXTVAL
,LEVEL
,或ROWNUM
。未完全指定的日期常量。
4 唯一约束
唯一约束是一种完整性约束,可确保存储在列或列组中的数据在表中的行中是唯一的。
语法
CREATE TABLE table_name (...column_name data_type UNIQUE...
);
-- 也可以
CREATE TABLE table_name (...,UNIQUE(column_name)
);
-- 指定约束名
CREATE TABLE table_name (...column_name data_type CONSTRAINT unique_constraint_name UNIQUE...
);
外部添加
CREATE TABLE table_name (...column_name data_type,...,CONSTRAINT unique_constraint_name UNIQUE(column_name)
);
组合唯一
CREATE TABLE table_name (...column_name1 data_type,column_name2 data_type,...,CONSTRAINT unique_constraint_name UNIQUE(column_name1, column_name2)
);
修改表添加唯一
ALTER TABLE table_name
ADD CONSTRAINT unique_constraint_name UNIQUE(column_name1, column_nam2);
示例
CREATE TABLE clients (client_id NUMBER GENERATED BY DEFAULT AS IDENTITY,first_name VARCHAR2(50) NOT NULL,last_name VARCHAR2(50) NOT NULL,company_name VARCHAR2(255) NOT NULL,email VARCHAR2(255) NOT NULL UNIQUE,phone VARCHAR(25)
);
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Christene','Snider','christene.snider@abc.com', 'ABC Inc', '408-875-6075');
再插入
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Sherly','Snider','christene.snider@abc.com', 'ABC Inc', '408-875-6076');
报错
5 非空约束
Oracle NOT NULL
约束指定列不能包含NULL值。Oracle NOT NULL
约束是内联约束,通常在CREATE TABLE
语句的列定义中使用。
语法
CREATE TABLE table_name (...column_name data_type NOT NULL...
);
修改表加非空
ALTER TABLE table_name MODIFY ( column_name NOT NULL);
eg
CREATE TABLE surcharges (surcharge_id NUMBER GENERATED BY DEFAULT AS IDENTITY,surcharge_name VARCHAR2(255) NOT NULL,amount NUMBER(9,2),PRIMARY KEY (surcharge_id)
);
插入
INSERT INTO surcharges(surcharge_name, amount)
VALUES('Late order placement',10);
再插入
INSERT INTO surcharges(surcharge_name, amount)
VALUES(null,20);
去除非空
ALTER TABLE table_name MODIFY ( column_name NULL)
四、数据类型
在Oracle中,每个值都有一个数据类型,它定义了值的一组特征。这些特性使Oracle将一种数据类型的值与另一种数据类型的值区别对待。例如,您可以添加number数据类型的值,但不能添加RAW数据类型的值。
创建新表时,请为其每个列指定数据类型。同样,在创建新过程时,可以为其每个参数指定数据类型。数据类型定义每个列或参数可以存储的允许值。例如,date列无法存储2月30日的值,因为这不是有效日期。
Oracle有许多内置数据类型,如下表所示:
Code | Data Type |
---|---|
1 | VARCHAR2(size [BYTE | CHAR]) |
1 | NVARCHAR2(size) |
2 | NUMBER[(precision [, scale]]) |
8 | LONG |
12 | DATE |
21 | BINARY_FLOAT |
22 | BINARY_DOUBLE |
23 | RAW(size) |
24 | LONG RAW |
69 | ROWID |
96 | CHAR [(size [BYTE | CHAR])] |
96 | NCHAR[(size)] |
112 | CLOB |
112 | NCLOB |
113 | BLOB |
114 | BFILE |
180 | TIMESTAMP [(fractional_seconds)] |
181 | TIMESTAMP [(fractional_seconds)] WITH TIME ZONE |
182 | INTERVAL YEAR [(year_precision)] TO MONTH |
183 | INTERVAL DAY [(day_precision)] TO SECOND[(fractional_seconds)] |
208 | UROWID [(size)] |
231 | TIMESTAMP [(fractional_seconds)] WITH LOCAL TIMEZONE |
每种数据类型都有一个由Oracle内部管理的代码。要查找列中值的数据类型代码,请使用该DUMP()
函数。
12C官方指引:https://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF0021
Oracle数据库的应用详解相关推荐
- python连接oracle数据库的方法_Python3.6连接Oracle数据库的方法详解
本文实例讲述了Python3.6连接Oracle数据库的方法.分享给大家供大家参考,具体如下: 下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Ora ...
- 资源放送丨《Oracle数据库索引分裂详解》PPT视频
点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 孙加鹏 老师分享了<Oracle数据库索引分裂详解>,在这里我们将课件PPT和实况录像分享 ...
- 本周两场直播丨通过源码了解openGauss多线程架构;Oracle数据库索引分裂详解。...
1.管中窥豹之通过源码了解openGauss多线程架构-8月18日20:00 本讲座主要介绍openGauss的多线程架构,通过源码了解线程间通信机制.线程池的原理和优势.如何开启线程池等,力图通过多 ...
- zabbix如何监控oracle,使用zabbix监控oracle数据库的方法详解
一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix+python监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需 ...
- oracle数据库闪回详解
Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法. 本文主要对Oracle常用闪回使用做些详 ...
- oracle数据库游标是什么意思,oracle数据库游标用法详解
oracle 游标用法详解 1.什么是游标 游标是一种PL/SQL控制结构,可以对SQL语句进行显示控制,便于对表的数据逐条进行处理 2.游标分类 显示游标: Declared and named b ...
- 存clob为空的值_将网页文本(HTML)保存到ORACLE数据库CLOB字详解
网上常见的例子总是将文本文件上传至数据库的方法.今天在做文档管理相关系统时,需要将网页上的文本输入框(textarea或input)中的内容,上传到ORACLE数据库的CLOB字段中去.在网上找了好长 ...
- asp.net连oracle数据库,ASP.NET连接Oracle数据库的步骤详解(转)
在用ASP.NET开发应用程序时,我们会用到数据库.ASP.NET与Oracle的连接也是比较常用的.本文主要介绍了ASP.NET连接Oracle数据库的方法和步骤.ASP.NET连接Oracle数据 ...
- oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
Oracle数据库并行处理技术是数据库的一项核心技术,它使组织能够高效地管理和访问TB级的数据.如果不能提供高效的Oracle数据库并行处理技术,这些大型数据库(通常用于数据仓库但也越来越多地出现在业 ...
- 阐述oracle的体系结构,Oracle数据库逻辑体系结构详解
以前对Oracle数据库的了解大多数是集中在mysql,最近工作里面一直使用的是Oracle,虽然说在互联网行业mysql大行其道,但是一些传统行业或者是金融领域还是更加倾向于使用oracle,sql ...
最新文章
- ***突然断开可能是ADSL猫惹的祸
- 阿里 Sentinel 源码解析
- 内控体系建设五步骤_进一步完善环境保护标准体系建设 ——《国家环境保护标准“十三五”发展规划》解读...
- Promise是Monad吗?
- opencv grabcut
- 雷人的调查:荷兰女性的安全意识
- 手把手教你做挖矿应急响应
- 一个案例、6个步骤全程详解A/B测试,看这篇就够了!
- CGVAE -> Delinker -> DeepCoy
- kubenetes 1.4 安装后8080端口无法访问
- 你是如何抵制百度系列产品的?
- 一文读懂「云上企业级存储」
- VDN平台各种数据库连接设置
- List集合去重的三种方法
- springboot通过maven管理mysql驱动加载失败
- 智能电视聚好看连接服务器失败,海信电视网络异常解决办法
- mybatis传入多个参数
- 电子计算机的字母是什么意思,计算器上的英文字母
- ubuntu开启客户端nfs服务_ubuntu16.04搭建nfs服务的方法
- python画五角星-Python的画五角星
热门文章
- 左手坐标系 vs 右手坐标系
- 未来的IT部门还有存在的意义吗?
- 《再吃十次蛋糕 就可以找爸爸了》
- 浏览器 禁用 javascript 脚本 解决 网页文本内容无法复制 的问题
- argparse 或者 click中出现‘int‘ object is not iterable
- python 参数后面加冒号:, 函数后面的添加箭头 None
- 如何把文字转换成语音,这里给你答案
- websocket是否需要处理粘包半包问题分析
- phpemspro模拟考试无试题_GitHub - maosea0125/phpems: PHPEMS在线模拟考试系统
- 数字孪生汽车制造工艺车间 | 智慧工厂