当前位置: 首页 > news >正文

滚雪球学Oracle[3.3讲]:数据定义语言(DDL)

全文目录:

    • 前言
    • 一、约束的高级使用
      • 1.1 主键(Primary Key)
        • 案例演示:定义主键
      • 1.2 唯一性约束(Unique)
        • 案例演示:定义唯一性约束
      • 1.3 外键(Foreign Key)
        • 案例演示:定义外键
      • 1.4 复合主键与外键
        • 案例演示:定义复合主键与外键
    • 二、视图、同义词和序列的管理
      • 2.1 视图(View)
        • 案例演示:创建视图
      • 2.2 同义词(Synonym)
        • 案例演示:创建同义词
      • 2.3 序列(Sequence)
        • 案例演示:创建序列
    • 三、表分区的设计与实施
      • 3.1 表分区的类型
      • 3.2 案例演示:范围分区
        • 创建分区表
      • 3.3 案例演示:哈希分区
    • 四、延伸讨论:约束与表分区的结合
        • 案例演示:分区表的主键和外键约束
    • 结语

前言

在上期内容中,我们深入探讨了查询与数据操作基础,重点讲解了如何使用SQL语言执行数据查询、插入、更新与删除操作。通过这些基础的SQL操作,大家了解了如何与数据库交互、修改数据,并为业务应用提供支持。这些操作属于数据操作语言(DML)的范畴,帮助我们掌握了数据库操作的基础知识。

在本期,我们将更进一步,进入数据定义语言(DDL)的领域。DDL是用于定义和修改数据库结构的语言,它负责创建、修改和删除数据库对象。我们将从约束的高级使用(如主键、唯一性、外键等)入手,详细讨论DDL的核心功能。除此之外,我们还将探讨视图、同义词和序列的管理,以及如何通过表分区的设计与实施来提升数据库的性能与可维护性。本文将通过实例演示,帮助大家更深入理解DDL的实际应用。

一、约束的高级使用

在数据库设计中,约束用于限制表中的数据,以保证数据的一致性、完整性和准确性。常用的约束包括主键(Primary Key)、唯一性(Unique)、外键(Foreign Key)、非空(NOT NULL)和检查(CHECK)等。

1.1 主键(Primary Key)

主键是用于唯一标识表中每一行的列或列组合。每个表只能有一个主键,且主键列不能为空值。主键约束在创建表时定义,也可以通过ALTER TABLE命令后期添加。

案例演示:定义主键
CREATE TABLE employees (employee_id NUMBER PRIMARY KEY,first_name VARCHAR2(50),last_name VARCHAR2(50),hire_date DATE
);

在上面的例子中,employee_id是员工表的主键,用于唯一标识每个员工。

1.2 唯一性约束(Unique)

唯一性约束确保列中的值是唯一的,不会重复。与主键不同,表中可以有多个唯一性约束,且唯一性列允许为空值。

案例演示:定义唯一性约束
CREATE TABLE departments (department_id NUMBER PRIMARY KEY,department_name VARCHAR2(100) UNIQUE
);

在此例中,department_name必须是唯一的,这样可以确保每个部门名称在系统中不重复。

1.3 外键(Foreign Key)

外键用于维护表与表之间的关系,通常用来定义表与另一张表的引用关系。外键约束确保引用的值在父表中存在,保证数据的一致性和完整性。

案例演示:定义外键
CREATE TABLE orders (order_id NUMBER PRIMARY KEY,employee_id NUMBER,order_date DATE,CONSTRAINT fk_employee FOREIGN KEY (employee_id)REFERENCES employees (employee_id)
);

在这个示例中,employee_id是外键,确保每个订单中的employee_id必须是employees表中已存在的员工。

1.4 复合主键与外键

复合主键复合外键涉及多个列的组合,它们在一些需要联合唯一性验证或关系绑定的业务场景中使用较多。

案例演示:定义复合主键与外键
CREATE TABLE project_assignments (project_id NUMBER,employee_id NUMBER,assignment_date DATE,PRIMARY KEY (project_id, employee_id),CONSTRAINT fk_employee_project FOREIGN KEY (employee_id)REFERENCES employees (employee_id)
);

此表的主键是project_idemployee_id的组合,表示一个项目可以有多个员工参与,而每个员工在项目中的记录是唯一的。

二、视图、同义词和序列的管理

在数据库中,视图同义词序列是非常重要的高级对象,它们为数据访问、管理和数据生成提供了极大的灵活性。

2.1 视图(View)

视图是一种虚拟表,它基于SQL查询创建,允许用户像操作表一样操作它。视图的主要优势是简化复杂查询、提供数据安全性(隐藏某些列)以及提高数据复用性。

案例演示:创建视图
CREATE VIEW employee_view AS
SELECT employee_id, first_name, last_name
FROM employees
WHERE hire_date > TO_DATE('2020-01-01', 'YYYY-MM-DD');

通过创建视图employee_view,我们可以快速访问自2020年以来雇佣的员工数据,而不必每次都编写复杂的查询。

2.2 同义词(Synonym)

同义词是数据库对象的别名,用于简化对象的访问,特别是在跨用户或跨模式的场景下。同义词可以是公共的,也可以是私有的。

案例演示:创建同义词
CREATE SYNONYM emp FOR employees;

这样,用户在查询时可以使用emp来代替employees表,简化访问。

2.3 序列(Sequence)

序列用于生成唯一的数值,常用于自动生成主键值。序列在插入数据时可以避免手动输入主键,确保每条记录都有唯一标识符。

案例演示:创建序列
CREATE SEQUENCE emp_seq
START WITH 1
INCREMENT BY 1
NOCACHE;

在插入新员工时,可以通过emp_seq.NEXTVAL来获取下一个唯一值作为employee_id

INSERT INTO employees (employee_id, first_name, last_name, hire_date)
VALUES (emp_seq.NEXTVAL, 'John', 'Doe', SYSDATE);

三、表分区的设计与实施

随着数据库数据量的增加,查询和管理大表的效率可能会大幅下降。表分区是一种非常有效的技术,允许将大表的数据根据某些条件拆分成多个部分,从而提升查询效率、管理性能和备份恢复能力。

3.1 表分区的类型

Oracle支持多种分区方式,常见的包括:

  • 范围分区(Range Partitioning):根据值的范围进行分区。
  • 列表分区(List Partitioning):根据离散的值进行分区。
  • 哈希分区(Hash Partitioning):通过哈希函数将数据均匀分布到不同的分区中。
  • 组合分区(Composite Partitioning):将多种分区方式结合起来。

3.2 案例演示:范围分区

创建分区表

我们可以创建一个根据日期范围进行分区的订单表,确保历史订单与当前订单在不同的分区中存储,从而提升查询效率。

CREATE TABLE orders_partitioned (order_id NUMBER PRIMARY KEY,order_date DATE,total_amount NUMBER
)
PARTITION BY RANGE (order_date) (PARTITION p1 VALUES LESS THAN (TO_DATE('2021-01-01', 'YYYY-MM-DD')),PARTITION p2 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')),PARTITION p3 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),PARTITION p4 VALUES LESS THAN (MAXVALUE)
);

在该表中,orders_partitioned根据order_date进行分区,旧的订单和新的订单存储在不同的分区中。当查询历史订单时,数据库只需扫描相关分区,极大地提高了查询效率。

3.3 案例演示:哈希分区

哈希分区适用于数据分布较为均匀的场景。通过哈希函数,我们可以确保数据被均匀分布在多个分区中,从而优化负载均衡。

CREATE TABLE customer_hash_partitioned (customer_id NUMBER PRIMARY KEY,customer_name VARCHAR2(100),region_id NUMBER
)
PARTITION BY HASH (region_id) PARTITIONS 4;

这里,customer_hash_partitioned表通过region_id进行哈希分区,确保每个地区的客户均匀分布到四个分区中。

四、延伸讨论:约束与表分区的结合

在实际的数据库设计中,约束和表分区往往需要结合使用。通过在分区表中定义主键、唯一性约束和外键约束,我们可以在提高查询效率的同时,确保数据的一致性和完整性。

案例演示:分区表的主键和外键约束
CREATE TABLE sales_partitioned (sale_id NUMBER,customer_id NUMBER,sale_date DATE,amount NUMBER,PRIMARY KEY (sale_id),CONSTRAINT fk_customer FOREIGN KEY (customer_id)REFERENCES customer_hash_partitioned (customer_id)
)
PARTITION BY RANGE (sale_date) (PARTITION p1 VALUES LESS THAN (TO_DATE('2022-01-01', 'YYYY-MM-DD')),PARTITION p2 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

该表定义了主键和外键约束,同时将sale_date用于分区。通过这种方式,我们既能确保数据一致性,又能享受分区带来的性能优化。

结语

在本期内容中,我们详细探讨了数据定义语言(DDL)的各个方面,涵盖了约束的高级使用、视图和同义词的管理、序列的生成,以及表分区的设计与实施。通过这些知识,大家能够更好地定义和管理数据库结构,为后续的数据操作和性能优化奠定坚实基础。

下期内容将重点讨论事务控制与锁管理,深入理解如何管理并发操作,确保数据库事务的完整性与一致性。敬请期待!


参考文献:

  • Oracle数据库官方文档
  • 数据库设计与优化实战

相关文章:

滚雪球学Oracle[3.3讲]:数据定义语言(DDL)

全文目录: 前言一、约束的高级使用1.1 主键(Primary Key)案例演示:定义主键 1.2 唯一性约束(Unique)案例演示:定义唯一性约束 1.3 外键(Foreign Key)案例演示&#xff1a…...

ssrf学习(ctfhub靶场)

ssrf练习 目录 ssrf类型 漏洞形成原理(来自网络) 靶场题目 第一题(url探测网站下文件) 第二关(使用伪协议) 关于http和file协议的理解 file协议 http协议 第三关(端口扫描&#xff09…...

ElasticSearch之网络配置

对官方文档Networking的阅读笔记。 ES集群中的节点,支持处理两类通信平面 集群内节点之间的通信,官方文档称之为transport layer。集群外的通信,处理客户端下发的请求,比如数据的CRUD,检索等,官方文档称之…...

【C语言进阶】系统测试与调试

1. 引言 在开始本教程的深度学习之前,我们需要了解整个教程的目标及其结构,以及为何进阶学习是提升C语言技能的关键。 目标和结构: 教程目标:本教程旨在通过系统化的学习,从单元测试、系统集成测试到调试技巧&#xf…...

多个单链表的合成

建立两个非递减有序单链表,然后合并成一个非递增有序的单链表。 注意:建立非递减有序的单链表,需要采用创建单链表的算法 输入格式: 1 9 5 7 3 0 2 8 4 6 0 输出格式: 9 8 7 6 5 4 3 2 1 输入样例: 在这里给出一组输入。例如&#xf…...

『建议收藏』ChatGPT Canvas功能进阶使用指南!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

Ollama 运行视觉语言模型LLaVA

Ollama的LLaVA(大型语言和视觉助手)模型集已更新至 1.6 版,支持: 更高的图像分辨率:支持高达 4 倍的像素,使模型能够掌握更多细节。改进的文本识别和推理能力:在附加文档、图表和图表数据集上进…...

gdb 调试 linux 应用程序的技巧介绍

使用 gdb 来调试 Linux 应用程序时,可以显著提高开发和调试的效率。gdb(GNU 调试器)是一款功能强大的调试工具,适用于调试各类 C、C 程序。它允许我们在运行程序时检查其状态,设置断点,跟踪变量值的变化&am…...

Java项目实战II基于Java+Spring Boot+MySQL的房产销售系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着房地产市场的蓬勃发展,房产销售业务日益复杂,传统的手工管理方式已难以满…...

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容: 使用AWS CLI配置密钥对创建ec2 server使用drawio(vscode插件)进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台,可以提供ec2,vpc,SNS以及clo…...

【Python】Eventlet 异步网络库简介

Eventlet 是一个 Python 的异步网络库,它使用协程(green threads)来简化并发编程。通过非阻塞的 I/O 操作,Eventlet 使得你可以轻松编写高性能的网络应用程序,而无需处理复杂的回调逻辑或编写多线程代码。它广泛应用于…...

【JNI】数组的基本使用

在上一期讲了基本类型的基本使用,这期来说一说数组的基本使用 HelloJNI.java:实现myArray函数,把一个整型数组转换为双精度型数组 public class HelloJNI { static {System.loadLibrary("hello"); }private native String HelloW…...

React跨平台

React的跨平台应用开发详解如下: 一、跨平台能力 React本身是一个用于构建用户界面的JavaScript库,但它通过React Native等框架实现了跨平台应用开发的能力。React Native允许开发者使用JavaScript和React来编写原生应用,这些应用可以在iOS和…...

如何在 SQL 中更新表中的记录?

当你需要修改数据库中已存在的数据时,UPDATE 语句是你的首选工具。 这允许你更改表中一条或多条记录的特定字段值。 下面我将详细介绍如何使用 UPDATE 语句,并提供一些开发建议和注意事项。 基础用法 假设我们有一个名为 employees 的表,…...

宠物饮水机的水箱低液位提醒如何实现?

ICMAN液位检测芯片轻松实现宠物饮水机的水箱低液位提醒功能! 工作原理 : 基于双通道电容式单点液位检测原理 方案特点: 液位检测精度高达1mm,超强抗干扰,动态CS 10V 为家用电器水位提醒的应用提供了一种简单而又有…...

EXCEL_光标百分比

Public Sub InitCells()Dim iSheet As LongFor iSheet Sheets.Count To 1 Step -1Sheets(iSheet).ActivateActiveWindow.Zoom 85ActiveWindow.ScrollRow 1ActiveWindow.ScrollColumn 1Sheets(iSheet).Range("A1").ActivateNext iSheetEnd Sub对日项目中的文档满天…...

(一)Web 网站服务之 Apache

一、Apache 的作用和特点 作用:Apache 是一款开源的网站服务器端软件,为网站的运行提供了稳定的基础。特点: 开源免费:这使得任何人都可以免费使用和修改它。模块化设计:具有高度的灵活性,可以根据需求选择…...

英语词汇小程序小程序|英语词汇小程序系统|基于java的四六级词汇小程序设计与实现(源码+数据库+文档)

英语词汇小程序 目录 基于java的四六级词汇小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师&a…...

AI学习指南深度学习篇-学习率衰减的实现机制

AI学习指南深度学习篇-学习率衰减的实现机制 前言 在深度学习中,学习率是影响模型训练的重要超参数之一。合理的学习率设置不仅可以加速模型收敛,还可以避免训练过程中出现各种问题,如过拟合或训练不收敛。学习率衰减是一种动态调整学习率的…...

My_qsort() -自己写的 qsort 函数

2024 - 10 - 05 - 笔记 - 21 作者(Author):郑龙浩 / 仟濹(网名) My_qsort()- 自己写的qsort函数 My_qsort为自己写的qsort函数,但是采用的不是快速排序,而是冒泡排序,是为了模仿qsort函数而尝试写出来的函数。 思路&#xff1a…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...