一、文档概述
文档主题:GBase8s 数据库 MySQL 兼容模式下,日期类型主键字段插入不同日期报主键冲突问题根因分析、解决方案及规范说明
适用场景:GBase8s 数据库、MySQL 兼容模式、表结构设计、数据插入异常、主键约束冲突
问题等级:高(阻断数据正常插入,影响业务功能)
二、问题现象
-
业务操作
在des_trd_calendar表的主键字段phy_date中插入两条不同日期数据:2026-01-02、2026-01-03 -
异常报错
数据库抛出 主键重复冲突(Duplicate entry),两条不同日期被判定为重复值,数据无法正常插入。 -
影响范围
交易日历表无法批量录入日期数据,业务功能不可用。
三、环境与 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 DATEbusiness_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 | ❌ 禁止 | 非字符串类型,加校对规则会破坏等值判断 |
七、问题总结
-
问题本质
GBase8s MySQL 模式自动为 ** 非字符串字段(date/bit)** 添加collate binary_ci,破坏数据库原生比较逻辑。 -
故障表现
不同日期插入主键字段,被判定为重复值,报主键冲突。 -
修复要点
- 禁止给
date/bit/数值类型添加校对规则 - 已异常表通过
ALTER TABLE MODIFY COLUMN修复字段类型
- 规范价值 避免后续同类隐性问题,统一 GBase8s MySQL 模式下表结构设计标准。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




