常见的OpenGauss兼容类型问题处理
一、如何选择与指定兼容类型?
OpenGauss 允许在 创建数据库时 指定兼容模式,这是一个不可更改的数据库级属性。
-
默认兼容性:
您观察得非常准确。OpenGauss 的默认兼容模式是
ORACLE
。这意味着如果您在创建数据库时没有显式指定,该库将默认遵循 Oracle 的语法和行为习惯。 -
创建时指定兼容类型:
您可以在执行
CREATE DATABASE
语句时,通过DBCOMPATIBILITY
参数来指定所需的兼容类型。语法:
CREATE DATABASE database_name DBCOMPATIBILITY = 'compatibility_type';
比如哈:
-- 创建一个兼容 Oracle 的数据库(与默认行为一致) CREATE DATABASE my_db_oracle DBCOMPATIBILITY = 'ORA'; -- 创建一个兼容 PostgreSQL 的数据库 CREATE DATABASE my_db_pg DBCOMPATIBILITY = 'PG'; -- 创建一个兼容 MySQL 的数据库 (注意:通常为'B',但请以官方文档为准) CREATE DATABASE my_db_mysql DBCOMPATIBILITY = 'MYSQL';
关键参数说明:
-
'ORA'
: 兼容 Oracle。 -
'PG'
: 兼容 PostgreSQL。 -
'MYSQL'
或'B'
: 兼容 MySQL/TD(具体取值请查阅对应版本文档)。
重要提示: 兼容模式一旦设定,无法在数据库创建后进行修改。因此,在初始化时必须根据应用的需求做出正确选择。
-
二、为什么在默认兼容Oracle模式下会失败?
-
在 PostgreSQL 兼容模式 (
PG
) 下:执行
ALTER TABLE ... ADD COLUMN ... NOT NULL DEFAULT ''
会成功。PostgreSQL 的处理方式是:首先添加允许为 NULL 的列,然后用默认值''
填充所有现有行,最后再将列的约束从 NULL 改为 NOT NULL。整个过程对用户是无感的、自动完成的。 -
在 Oracle 兼容模式 (
ORA
) 下(也是您遇到的情况):执行相同的语句会失败。OpenGauss 为了更严格地模拟 Oracle 的行为,并确保数据的绝对明确性,会采取更保守的策略。它试图直接添加一个 NOT NULL 约束,但在填充默认值之前,会先检查“现有数据是否已经满足这个新约束”。由于该列是全新的,所有现有行在此列上 logically 都是 NULL,因此检查失败,抛出 “contains null values” 错误。
这实际上是 Oracle 数据库本身的行为。在 Oracle 中,添加一个带默认值且非空的列,也需要满足类似的条件。
三、解决方案
既然知道了原因,解决方法就清晰了。在 Oracle 兼容模式下,您需要将“添加列”和“更新数据”作为两个独立的步骤来执行。
咱们就用下面 SQL 语句来代替:
-- 1. 先添加一个可为 NULL 的列,并设置默认值。
-- (此操作会立即将默认值填充到所有现有行的新列中)
ALTER TABLE forum_demo01_contact
ADD COLUMN test_col varchar(100) DEFAULT '';
-- 2. 再将这个列修改为 NOT NULL。
-- (此时所有行都已经有值了,所以 NOT NULL 约束可以安全添加)
ALTER TABLE forum_demo01_contact
ALTER COLUMN test_col SET NOT NULL;
总结一下下
-
选择兼容模式:在
CREATE DATABASE
时通过DBCOMPATIBILITY
参数指定(如'ORA'
或'PG'
),此选择至关重要且不可更改。 -
默认模式:OpenGauss 默认兼容
ORACLE
。 -
报错原因:在
ORACLE
模式下,直接添加NOT NULL DEFAULT
列会先进行严格的数据校验,由于现有数据在新列为 NULL而导致失败。这是为了严格遵循 Oracle 的语义。 -
解决方案:在 Oracle 兼容模式下,将操作拆分为两个步:先
ADD COLUMN ... DEFAULT ...
,再ALTER COLUMN ... SET NOT NULL
。
- 点赞
- 收藏
- 关注作者
评论(0)