You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL插入触发报错:id列值超出范围问题求助

问题描述

我有一个名为products的MySQL表,最初描述的结构如下:

domain_id varchar(10),
data_source_id int(12),
id bigint(64),
title varchar(255)

该表配置了一个AFTER INSERT触发器,会将domain_id、data_source_id和id的值插入到另一张新表中。

执行以下插入语句时触发报错:

INSERT INTO products (domain_id, data_source_id, id, title) VALUES ("12345678", 123, 8083207880923, "test")

报错信息:

Out of range value for column 'id' at row 1.

可以确认的是,products表的id字段为BIGINT类型,8083207880923完全在该类型的取值范围内,且移除触发器后插入操作可正常执行。

以下是各表及触发器的完整DDL语句:

products表DDL

CREATE TABLE products (
    domain_id varchar(16) NOT NULL,
    data_sources_id int(12) UNSIGNED NOT NULL,
    id bigint(64) NOT NULL,
    title varchar(255) NOT NULL,
    PRIMARY KEY (domain_id, data_sources_id, id)
);

触发器目标表products_process的DDL

CREATE TABLE products_process (
    id int(10) UNSIGNED NOT NULL AUTO_INCREMENT primary key,
    domain_id varchar(10) NOT NULL,
    data_sources_id int(10) NOT NULL,
    product_id varchar(20) NOT NULL,
    processed tinyint DEFAULT 0,
    created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

触发器DDL

CREATE TRIGGER product_insert_trigger
  AFTER INSERT ON products
  FOR EACH ROW
  BEGIN
  INSERT INTO products_process (domain_id, data_sources_id, id)
  VALUES (NEW.domain_id, NEW.data_sources_id, NEW.id);
END;
问题根源

报错并非来自products表的插入操作,而是触发器执行时向products_process表插入数据的步骤出了问题:

  1. products_process表的id字段是自增主键,类型为int(10) UNSIGNED,其最大值仅为4294967295,但触发器却将NEW.id(值为8083207880923)插入到这个字段,数值远超该类型的取值范围,直接触发“超出范围”报错。
  2. 另外,products_process表中专门用于存储产品ID的字段是product_id(varchar(20)类型),但触发器的插入语句完全错误地跳过了这个字段,反而试图覆盖自增主键id。
修复方案

修改触发器的插入逻辑,将NEW.id插入到products_process表的product_id字段,而非id字段:

CREATE TRIGGER product_insert_trigger
  AFTER INSERT ON products
  FOR EACH ROW
  BEGIN
  INSERT INTO products_process (domain_id, data_sources_id, product_id)
  VALUES (NEW.domain_id, NEW.data_sources_id, NEW.id);
END;

同时建议同步调整以下字段类型,避免后续出现其他兼容问题:

  • 将products_process表的data_sources_id字段类型改为int(12) UNSIGNED,与products表的对应字段保持一致,防止插入大数值时再次触发范围报错。
  • 将products_process表的domain_id字段长度调整为varchar(16),与products表的对应字段长度一致,避免插入超长域名ID时触发截断或报错。

内容的提问来源于stack exchange,提问作者D.K. Goutham Kishore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:17:38