讨论|插入数据的时候提示这个报错怎么解决

该讨论来自于微信群聊,搬运君会尽力为大家搬运精品讨论,也希望大家能在中文社区讨论,方便得到更好的回复。

群友 1

请问插入数据的时候提示这个报错怎么解决

群友 2

没带分片键,导致 insert 数据路由到多个节点?

群友 1

rules:
!SHARDING # 数据分片规则配置
 autoTables:
 goods_collection:
 actualDataSources: ds_0
 shardingStrategy:
 standard:
 shardingColumn: user_id
 shardingAlgorithmName: hash_ptn_16
 keyGenerateStrategy:
 column: id
 keyGeneratorName: snowflake_ptn_16
shardingAlgorithms:
hash_ptn_16:
 type: HASH_MOD
 props:
 sharding-count: 16
keyGenerators:
snowflake_ptn_16:
 type: SNOWFLAKE
 props:
 worker-id: 123
 max-vibration-offset: 15

群友 2

执行语句是?

群友 1

INSERT INTO `sharding_db`.`goods_collection`(`id`, `user_id`, `goods_no`, `created_at`, `updated_at`, `status`, `last_look_status`, `is_reshelf`, `reshelf_time`, `collect_shop_price`) VALUES (NULL, 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 1, 1, 0, '0000-00-00 00:00:00', 0.00);

群友 2

本地没复现你的异常

注册中心里面的 rule 能 copy 下吗

群友 1

@群友 1 在3307里面看不到数据并且报错,但是在真实数据源可以看到插入的数据

群友 2

这个是 navicat 连接 proxy 报的错?

goods_collection 这个表的初始化语句帮忙发下

群友 1

是的

CREATE TABLE `goods_collection` ( `id` bigint unsigned NOT NULL COMMENT '主键id', `user_id` mediumint unsigned NOT NULL DEFAULT '0' COMMENT '用户id', `goods_no` int unsigned NOT NULL DEFAULT '0' COMMENT '货号', `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '收藏状态{0:收藏失败 (不会删除记录),1:收藏成功}', `last_look_status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '最后一次查看状态{0:断货,1:正常}', `is_reshelf` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否重新上架{0:非重新上架,1:重新上架}', `reshelf_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '重新上架时间', `collect_shop_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '收藏时的销售价', PRIMARY KEY (`id`) USING BTREE, KEY `idx_goods_no` (`goods_no`), KEY `idx_created_at` (`created_at`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品收藏表';

这个哈希取模算法好像不太均匀

群友 3

你们的 user_id 是数字,直接用 mod 就好了,不需要先 hash

数字也是按字符串来做 hash

群友 2

@群友 1 这个语句好像有点问题

语句在 mysql 8.x 上面执行异常

是 mysql 配置问题,我改下

去掉 id 字段之后,路由正常,没有出现你前面发的异常

@群友 1 这个问题我猜测你的 zk 里面的 rule 可能和你发的不一致,有可能弄错乱了

第二个问题,你用的 navicat 版本是多少?

群友 1

可以了,是时间戳的问题。和 navicat 没什么问题,麻烦了

CREATE TABLE `goods_collection` (
  `id` bigint unsigned NOT NULL COMMENT '主键id',
  `user_id` mediumint unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
  `goods_no` int unsigned NOT NULL DEFAULT '0' COMMENT '货号',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '收藏状态{0:收藏失败 (不会删除记录),1:收藏成功}',
  `last_look_status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '最后一次查看状态{0:断货,1:正常}',
  `is_reshelf` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '是否重新上架{0:非重新上架,1:重新上架}',
  `reshelf_time` timestamp NOT NULL COMMENT '重新上架时间',
  `collect_shop_price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '收藏时的销售价',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_goods_no` (`goods_no`),
  KEY `idx_created_at` (`created_at`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品收藏表';

将默认default'0000-00-00 00:00:00' 改成当前时间戳了 DEFAULT CURRENT_TIMESTAMP

京ICP备2021015875号