Bootstrap

DDL区别:Oracle和Mysql

        在数据库管理系统(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
BEGIN
    SELECT 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
BEGIN
    SELECT 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');

;