常见的OpenGauss兼容类型问题处理

举报
Jack20 发表于 2025/09/03 16:06:48 2025/09/03
【摘要】 一、如何选择与指定兼容类型?OpenGauss 允许在 ​​创建数据库时​​ 指定兼容模式,这是一个不可更改的数据库级属性。​​默认兼容性​​:您观察得非常准确。​​OpenGauss 的默认兼容模式是 ORACLE​​。这意味着如果您在创建数据库时没有显式指定,该库将默认遵循 Oracle 的语法和行为习惯。​​创建时指定兼容类型​​:您可以在执行 CREATE DATABASE语句时,通...

b9903d0100ca4707bdcdd1e2adce0222.20250901025847.58787518106744910681883330608072.png

一、如何选择与指定兼容类型?

OpenGauss 允许在 ​​创建数据库时​​ 指定兼容模式,这是一个不可更改的数据库级属性。

  1. ​默认兼容性​​:

    您观察得非常准确。​​OpenGauss 的默认兼容模式是 ORACLE​。这意味着如果您在创建数据库时没有显式指定,该库将默认遵循 Oracle 的语法和行为习惯。

  2. ​创建时指定兼容类型​​:

    您可以在执行 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;

总结一下下

  1. ​选择兼容模式​​:在 CREATE DATABASE时通过 DBCOMPATIBILITY参数指定(如 'ORA''PG'),此选择至关重要且不可更改。

  2. ​默认模式​​:OpenGauss 默认兼容 ORACLE

  3. ​报错原因​​:在 ORACLE模式下,直接添加 NOT NULL DEFAULT列会先进行严格的数据校验,由于现有数据在新列为 NULL而导致失败。这是为了严格遵循 Oracle 的语义。

  4. ​解决方案​​:在 Oracle 兼容模式下,将操作拆分为两个步:​​先 ADD COLUMN ... DEFAULT ...,再 ALTER COLUMN ... SET NOT NULL​。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。