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表插入数据的步骤出了问题:
products_process表的id字段是自增主键,类型为int(10) UNSIGNED,其最大值仅为4294967295,但触发器却将NEW.id(值为8083207880923)插入到这个字段,数值远超该类型的取值范围,直接触发“超出范围”报错。- 另外,
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
相关产品推荐
相关产品推荐

