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