DDL区别:Oracle和Mysql

ops/2025/2/26 17:34:06/

        在数据库管理系统(DBMS)中,DDL(数据定义语言,Data Definition Language)用于定义和管理数据库结构,如表、索引、视图等。OracleMySQL 作为两种主流的关系型数据库,在 DDL 语法和特性上存在一些重要区别。本文将从数据类型、表创建、约束、索引、序列、自增主键、分区表等方面进行对比分析。

1. 数据类型对比

Oracle 和 MySQL 支持的数据类型存在较大差异,尤其是在字符串、数值类型和日期时间类型上。

  • Oracle 的 NUMBER(P, S) 具有变长存储特性,比 MySQL DECIMAL(P, S) 更节省存储空间。
  • MySQL 原生支持 BOOLEANJSON,而 Oracle 需要用 NUMBER(1)CLOB 代替。
  • Oracle 使用 VARCHAR2(n) 而不是 VARCHAR(n),区别在于 VARCHAR2 处理空字符串不同。

2. 创建表(CREATE TABLE)

创建表的基本语法在 Oracle 和 MySQL 中类似,但有一些不同点。

Oracle:没有内建的自增字段,需要使用序列(SEQUENCE)和触发器来实现。

-- Oracle
CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE users (id NUMBER PRIMARY KEY,name VARCHAR2(50)
);
CREATE OR REPLACE TRIGGER trg_users
BEFORE INSERT ON users
FOR EACH ROW
BEGINSELECT user_seq.NEXTVAL INTO :NEW.id FROM DUAL;
END;
/
-- MySQL
CREATE TABLE my_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50)
);

代码解析

CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;

解释:

  • CREATE SEQUENCE user_seq:创建一个名为 user_seq序列SEQUENCE)。
  • START WITH 1:表示序列从 1 开始计数。
  • INCREMENT BY 1:每次调用 NEXTVAL,值增加 1

作用:

  • 由于 Oracle 没有 AUTO_INCREMENT 机制(不像 MySQL 那样),所以使用 SEQUENCE 生成唯一的自增 ID
  • user_seq.NEXTVAL 每次调用都会返回一个新的递增值,通常用于主键 id 赋值。

创建触发器(TRIGGER)

CREATE OR REPLACE TRIGGER trg_users
BEFORE INSERT ON users
FOR EACH ROW
BEGINSELECT user_seq.NEXTVAL INTO :NEW.id FROM DUAL;
END;
/

解释:

  • CREATE OR REPLACE TRIGGER trg_users
    • 创建(或替换)一个名为 trg_users触发器TRIGGER)。
    • 触发器的作用是在 插入(INSERT)数据前,自动填充 id 字段
  • BEFORE INSERT ON users
    • 触发器在 users 表执行 INSERT 语句 之前触发(BEFORE INSERT)。
  • FOR EACH ROW
    • 该触发器针对每一行插入操作生效(即 INSERT 一条数据时,触发一次)。
  • BEGIN ... END;
    • 触发器的 PL/SQL 代码块,定义触发器的具体执行逻辑。
  • SELECT user_seq.NEXTVAL INTO :NEW.id FROM DUAL;
    • 作用:查询 user_seq下一个值NEXTVAL),并赋值给 :NEW.id(即即将插入的新数据的 id 字段)。
    • :NEW.id 代表当前被插入的数据行中的 id 字段
    • DUAL 是 Oracle 的一个虚拟表,用于执行 SELECT 语句(无具体数据的查询)。

创建表和触发器后,用户无需手动指定 id,只需插入 name

INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');

触发器自动填充 id: 等效于:

INSERT INTO users (id, name) VALUES (1, 'Alice');
INSERT INTO users (id, name) VALUES (2, 'Bob');


http://www.ppmy.cn/ops/161458.html

相关文章

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍🔥打印界面讲解❤️缩印💕打印作文稿纸💞将文档打印成书籍💓限制编辑设置💗给文字文档加密💖文档导出为 PDF格式💘协作编辑模式💝能量站…

HTTP实验(ENSP模拟器实现)

目录 HTTP概述 HTTP实验 HTTPS 实验 HTTP概述 HTTP(HyperText Transfer Protocol,超文本传输协议),设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 HTTP定义了多种请求方法,常用的包括: …

word中对插入的图片修改背景色

关于对word中插入的图片修改背景色的问题,网上查了好多都无效,可能是由于word版本的问题,本人word版本为2019版,亲测有效的修改图片背景色为透明的小技巧: 选中图片-设置图片格式-最右面图标,选择图片校正…

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的,因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化,就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前,Java 是没有泛型功能的,…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统,作者为蒲乐天,后端基于puyuetianPHP框架驱动,前端基于 puyuetianUI框架驱动,默认编辑器为puyuetianEditor富文本编辑器,其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

Qt 自定义控件及插件使用浅谈

Qt 自定义控件及使用浅谈:控件个性化 1 摘要 在Qt开发中,自定义控件是一个非常重要的概念。通过自定义控件,开发者可以封装属于自己特定的功能和界面,以便在项目开发中多个地方复用。通过平时的积累封装更多于系统控件&#xff…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…

UE_C++ —— Gameplay Modules

目录 一,Module Creation INI File Setup 二,Multiple Gameplay Modules 三,Limitations 编译成 DLL 的游戏相关类的集合;正如引擎本身由一组模块构成一样,每个游戏也是由一个或多个游戏模块构成的;这些…