一、创建表

语法

CREATE TABLE schema_name.table_name (column_1 data_type column_constraint,column_2 data_type column_constraint,...table_constraint);
  • 首先,在CREATE TABLE子句上,指定新表所属的表名和模式名。

  • 其次,列出括号内的所有列。如果表有多列,则需要用逗号分隔每个列定义。列定义包括列名称后面它的数据类型例如NUMBERVARCHAR2和列约束如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_groupssuppliers

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_groupssuppliers表之间的关系是一对多的。换句话说,一个供应商组有许多供应商,而每个供应商必须属于供应商组。在向表中插入行之前suppliers,必须在表中查找现有group_idsupplier_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_groupssuppliers表的行之间的关系。

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);

删除与禁用启用同上。

检查约束的限制

  1. 您可以仅为表定义检查约束,而不是视图。

  2. 检查约束的表达式可以引用表中的任何列,但它不能引用其他表的列。

  3. 表达式也不能包含以下结构之一:

    • 非确定性的功能,如SYSDATE,currdate和CURRENT_TIMESTAMP

    • 子查询或标量子查询表达式。

    • 调用任何用户定义的函数。

    • 嵌套表列或属性。

    • 伪列CURRVALNEXTVALLEVEL,或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数据库的应用详解相关推荐

  1. python连接oracle数据库的方法_Python3.6连接Oracle数据库的方法详解

    本文实例讲述了Python3.6连接Oracle数据库的方法.分享给大家供大家参考,具体如下: 下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Ora ...

  2. 资源放送丨《Oracle数据库索引分裂详解》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 孙加鹏 老师分享了<Oracle数据库索引分裂详解>,在这里我们将课件PPT和实况录像分享 ...

  3. 本周两场直播丨通过源码了解openGauss多线程架构;Oracle数据库索引分裂详解。...

    1.管中窥豹之通过源码了解openGauss多线程架构-8月18日20:00 本讲座主要介绍openGauss的多线程架构,通过源码了解线程间通信机制.线程池的原理和优势.如何开启线程池等,力图通过多 ...

  4. zabbix如何监控oracle,使用zabbix监控oracle数据库的方法详解

    一.概述 zabbix是一款非常强大,同时也是应用最为广泛的开源监控软件,本文将给大家介绍如何利用zabbix+python监控oracle数据库. 二.环境介绍 以下是我安装的环境,实际部署时并不需 ...

  5. oracle数据库闪回详解

    Oracle 9i 开始支持闪回,Oracle10g开始全面支持闪回功能,Oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法. 本文主要对Oracle常用闪回使用做些详 ...

  6. oracle数据库游标是什么意思,oracle数据库游标用法详解

    oracle 游标用法详解 1.什么是游标 游标是一种PL/SQL控制结构,可以对SQL语句进行显示控制,便于对表的数据逐条进行处理 2.游标分类 显示游标: Declared and named b ...

  7. 存clob为空的值_将网页文本(HTML)保存到ORACLE数据库CLOB字详解

    网上常见的例子总是将文本文件上传至数据库的方法.今天在做文档管理相关系统时,需要将网页上的文本输入框(textarea或input)中的内容,上传到ORACLE数据库的CLOB字段中去.在网上找了好长 ...

  8. asp.net连oracle数据库,ASP.NET连接Oracle数据库的步骤详解(转)

    在用ASP.NET开发应用程序时,我们会用到数据库.ASP.NET与Oracle的连接也是比较常用的.本文主要介绍了ASP.NET连接Oracle数据库的方法和步骤.ASP.NET连接Oracle数据 ...

  9. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)

    Oracle数据库并行处理技术是数据库的一项核心技术,它使组织能够高效地管理和访问TB级的数据.如果不能提供高效的Oracle数据库并行处理技术,这些大型数据库(通常用于数据仓库但也越来越多地出现在业 ...

  10. 阐述oracle的体系结构,Oracle数据库逻辑体系结构详解

    以前对Oracle数据库的了解大多数是集中在mysql,最近工作里面一直使用的是Oracle,虽然说在互联网行业mysql大行其道,但是一些传统行业或者是金融领域还是更加倾向于使用oracle,sql ...

最新文章

  1. ***突然断开可能是ADSL猫惹的祸
  2. 阿里 Sentinel 源码解析
  3. 内控体系建设五步骤_进一步完善环境保护标准体系建设 ——《国家环境保护标准“十三五”发展规划》解读...
  4. Promise是Monad吗?
  5. opencv grabcut
  6. 雷人的调查:荷兰女性的安全意识
  7. 手把手教你做挖矿应急响应
  8. 一个案例、6个步骤全程详解A/B测试,看这篇就够了!
  9. CGVAE -> Delinker -> DeepCoy
  10. kubenetes 1.4 安装后8080端口无法访问
  11. 你是如何抵制百度系列产品的?
  12. 一文读懂「云上企业级存储」
  13. VDN平台各种数据库连接设置
  14. List集合去重的三种方法
  15. springboot通过maven管理mysql驱动加载失败
  16. 智能电视聚好看连接服务器失败,海信电视网络异常解决办法
  17. mybatis传入多个参数
  18. 电子计算机的字母是什么意思,计算器上的英文字母
  19. ubuntu开启客户端nfs服务_ubuntu16.04搭建nfs服务的方法
  20. python画五角星-Python的画五角星

热门文章

  1. 左手坐标系 vs 右手坐标系
  2. 未来的IT部门还有存在的意义吗?
  3. 《再吃十次蛋糕 就可以找爸爸了》
  4. 浏览器 禁用 javascript 脚本 解决 网页文本内容无法复制 的问题
  5. argparse 或者 click中出现‘int‘ object is not iterable
  6. python 参数后面加冒号:, 函数后面的添加箭头 None
  7. 如何把文字转换成语音,这里给你答案
  8. websocket是否需要处理粘包半包问题分析
  9. phpemspro模拟考试无试题_GitHub - maosea0125/phpems: PHPEMS在线模拟考试系统
  10. 数字孪生汽车制造工艺车间 | 智慧工厂