暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

GBase8s MySQL 模式主键冲突问题排查与修复文档

原创 南帝 2天前
15


一、文档概述

文档主题:GBase8s 数据库 MySQL 兼容模式下,日期类型主键字段插入不同日期报主键冲突问题根因分析、解决方案及规范说明


适用场景:GBase8s 数据库、MySQL 兼容模式、表结构设计、数据插入异常、主键约束冲突


问题等级:高(阻断数据正常插入,影响业务功能)


二、问题现象

  1. 业务操作

    des_trd_calendar 表的主键字段 phy_date 中插入两条不同日期数据: 2026-01-022026-01-03
  2. 异常报错

    数据库抛出 主键重复冲突(Duplicate entry),两条不同日期被判定为重复值,数据无法正常插入。
  3. 影响范围

    交易日历表无法批量录入日期数据,业务功能不可用。

三、环境与 SQL 信息

1. 手动执行的建表 SQL

sql

create table `des_trd_calendar` 
(
    `phy_date` date not null,
    `business_flag` bit(1) default (1) not null,
    `commit_flag` bit(1) default (1) not null,
    `money_type` varchar(255),
    `credit_fee_flag` varchar(255),
    primary key (`phy_date`)
)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ;


2. 数据库实际存储的表结构(dbschema 查看)

sql

create table `des_trd_calendar` 
(
    `phy_date` date collate binary_ci not null,
    `business_flag` bit(1) collate binary_ci default (1) not null,
    `commit_flag` bit(1) collate binary_ci default (1) not null,
    `money_type` varchar(255) collate binary_ci,
    `credit_fee_flag` varchar(255) collate binary_ci,
    primary key (`phy_date`)
);



四、根因分析

1. 关键字段说明:COLLATE binary_ci

  • COLLATE:数据库字符集校对规则,仅作用于字符串类型(varchar/char/text),控制等值比较、排序、大小写判断逻辑。
  • binary_ci:二进制比较、大小写不敏感。

2. 核心问题原因

GBase8s 在 MySQL 兼容模式下存在机制特性:

  • 手动建表时指定 CHARACTER SET / COLLATE
  • 数据库会自动为所有字段(包括 date、bit 等非字符串类型)强制添加 collate binary_ci
  • date /bit 类型不属于字符串,不支持校对规则
  • 强制添加后,数据库将日期按二进制字符串进行等值判断
  • 最终导致:不同日期被判定为相同值,触发主键唯一约束冲突

3. 错误字段清单

以下非字符串字段被错误添加 collate binary_ci,是主键冲突的直接原因:

  • phy_date DATE
  • business_flag BIT(1)
  • commit_flag BIT(1)

五、解决方案

方案 1:重新建表

sql

CREATE TABLE `des_trd_calendar` (
  `phy_date` DATE NOT NULL COMMENT '自然日,主键',
  `business_flag` BIT(1) DEFAULT 1 NOT NULL COMMENT '交易日标识:1=是,0=否',
  `commit_flag` BIT(1) DEFAULT 1 NOT NULL COMMENT '提交标识:1=已提交,0=未提交',
  `money_type` VARCHAR(255) COMMENT '币种',
  `credit_fee_flag` VARCHAR(255) COMMENT '手续费标识',
  PRIMARY KEY (`phy_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易日历配置表';


方案 2:存量表在线修复

sql

-- 修复主键日期字段
ALTER TABLE des_trd_calendar MODIFY COLUMN phy_date DATE NOT NULL;

-- 修复 bit 类型字段
ALTER TABLE des_trd_calendar MODIFY COLUMN business_flag BIT(1) DEFAULT 1 NOT NULL;
ALTER TABLE des_trd_calendar MODIFY COLUMN commit_flag BIT(1) DEFAULT 1 NOT NULL;



六、GBase8s + MySQL 模式 建表规范

表格

字段类型是否允许加 COLLATE风险说明
varchar/char/text✅ 允许字符串类型可正常使用
date/datetime/timestamp❌ 禁止会导致日期比较异常、主键冲突
int/bigint/bit/decimal❌ 禁止非字符串类型,加校对规则会破坏等值判断

七、问题总结

  1. 问题本质

    GBase8s MySQL 模式自动为 ** 非字符串字段(date/bit)** 添加 collate binary_ci,破坏数据库原生比较逻辑。
  2. 故障表现

    不同日期插入主键字段,被判定为重复值,报主键冲突。
  3. 修复要点

  • 禁止给 date/bit/数值类型 添加校对规则
  • 已异常表通过 ALTER TABLE MODIFY COLUMN 修复字段类型

  1. 规范价值 避免后续同类隐性问题,统一 GBase8s MySQL 模式下表结构设计标准。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论