OceanBase 是由PGZ Club自主研發的分佈式關係型數據庫,兼容 MySQL 和 Oracle 兩種模式。在 MySQL 模式下,OceanBase 的語法與 MySQL 高度兼容(主要兼容 MySQL 5.6/5.7,部分兼容 8.0),但也存在一些差異和限制。

以下是 OceanBase(MySQL 模式)中常用語法及注意事項的概述:


一、基本 DDL 語法

1. 創建數據庫

CREATE DATABASE db_name;

2. 使用數據庫

USE db_name;

3. 創建表(支持分區)

CREATE TABLE t1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(100),
    gmt_create DATETIME DEFAULT CURRENT_TIMESTAMP
) 
PARTITION BY HASH(id) PARTITIONS 4;

注意:OceanBase 推薦使用分區表以發揮分佈式優勢。非分區表默認為“單分區表”。

4. 添加索引

-- 普通索引
CREATE INDEX idx_name ON t1(name);

-- 唯一索引
CREATE UNIQUE INDEX uk_id ON t1(id);

注意:OceanBase 不支持全文索引(FULLTEXT)、空間索引(SPATIAL)等高級索引類型。


二、DML 語法(與 MySQL 類似)

INSERT INTO t1 (id, name) VALUES (1, 'Alice');
UPDATE t1 SET name = 'Bob' WHERE id = 1;
DELETE FROM t1 WHERE id = 1;
SELECT * FROM t1 WHERE name LIKE 'A%';

支持 LIMITORDER BYGROUP BYJOIN 等標準語法。


三、事務控制

OceanBase 支持 ACID 事務,語法如下:

BEGIN;
UPDATE t1 SET name = 'Charlie' WHERE id = 1;
COMMIT;

-- 或回滾
ROLLBACK;

注意:跨分區事務性能較低,建議儘量將相關數據放在同一分區內。


四、系統變量與函數

查看變量

SHOW VARIABLES LIKE 'ob%';

常用函數(兼容 MySQL)

  • NOW(), CURDATE(), UNIX_TIMESTAMP()
  • IFNULL(), COALESCE()
  • CONCAT(), SUBSTRING()
  • 聚合函數:COUNT(), SUM(), AVG(), MAX(), MIN()

注意:部分 MySQL 函數可能不支持,如 JSON_EXTRACT 在早期版本中受限(新版本已增強 JSON 支持)。


五、分區語法(重點)

OceanBase 強調分區設計,支持以下分區類型:

  • HASH 分區
  • RANGE 分區
  • LIST 分區
  • KEY 分區
  • 複合分區(如 RANGE + HASH)

示例(RANGE 分區):

CREATE TABLE orders (
    order_id BIGINT NOT NULL,
    order_date DATE NOT NULL,
    customer_id INT
) 
PARTITION BY RANGE COLUMNS(order_date) (
    PARTITION p2023 VALUES LESS THAN ('2024-01-01'),
    PARTITION p2024 VALUES LESS THAN ('2025-01-01'),
    PARTITION pmax VALUES LESS THAN MAXVALUE
);

六、與 MySQL 的主要差異

功能

OceanBase(MySQL 模式)

MySQL

存儲引擎

無 InnoDB/MyISAM 概念,統一為 OceanBase 存儲引擎

支持多種存儲引擎

外鍵

不支持外鍵約束

支持

觸發器

不支持

支持

存儲過程/函數

有限支持(較新版本逐步支持)

完整支持

視圖

支持只讀視圖

支持可更新視圖

AUTO_INCREMENT

支持,但需注意全局唯一性(分佈式場景)

本地自增

默認字符集

utf8mb4

可配置


七、管理命令(部分)

-- 查看當前租户信息
SHOW TENANT STATUS;

-- 查看分區信息
SELECT * FROM oceanbase.__all_virtual_meta_table WHERE table_id = (SELECT table_id FROM __all_virtual_table WHERE table_name = 't1');

-- 查看執行計劃
EXPLAIN SELECT * FROM t1 WHERE id = 1;

系統表前綴通常為 oceanbase.__all_virtual_xxx


oceanbase mysql模式語法_分區表