在数据库管理系统(DBMS)中,DDL(数据定义语言,Data Definition Language)用于定义和管理数据库结构,如表、索引、视图等。Oracle 和 MySQL 作为两种主流的关系型数据库,在 DDL 语法和特性上存在一些重要区别。本文将从数据类型、表创建、约束、索引、序列、自增主键、分区表等方面进行对比分析。
1. 数据类型对比
Oracle 和 MySQL 支持的数据类型存在较大差异,尤其是在字符串、数值类型和日期时间类型上。
- Oracle 的
NUMBER(P, S)
具有变长存储特性,比 MySQLDECIMAL(P, S)
更节省存储空间。 - MySQL 原生支持
BOOLEAN
和JSON
,而 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');