类似于上一个问题,我有here,我有一个表,用于存储用户生成的地图的主题,前缀和后缀,其思想是,由于以下原因,没有地图可以具有相同的名称:标识符索引。
这是我的桌子(删除了其他字段以使其简短):
CREATE TABLE IF NOT EXISTS `map_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`author_id` int(11) NOT NULL,
`map_theme` int(11) NOT NULL,
`map_prefix_id` int(11) NOT NULL DEFAULT '1',
`map_suffix_id` int(11) NOT NULL DEFAULT '1',
`map_identifier_index` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`) /*!80000 INVISIBLE */,
UNIQUE KEY `uidx_atc` (`map_theme`,`map_prefix_id`,`map_suffix_id`,`map_identifier_index`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
这是一个基于上面链接中的插入语句的示例插入语句:
INSERT INTO map_info (author_id, author_time, map_theme, map_prefix_id, map_suffix_id, map_identifier_index) SELECT 3, 0, 1, 7, 3, COALESCE(MAX(map_identifier_index) + 1, 1) from map_info where map_theme = 1;
理论上,如果用户要插入另一个主题为1,前缀为7,后缀为3的地图,则要插入的地图标识符将自动递增为2,作为具有相同主题的地图,前缀和后缀组合已经存在。如果其中任何一个不同,则地图标识符将默认为1。
但是,实际上,即使前缀-后缀组合是唯一的,地图标识符也会增加,唯一看起来可以改变它的是主题。
我不确定自己在做什么错,因为自上次以来,唯一键中仅剩一列。
是插入语句吗?
答案 0 :(得分:1)
您说:
插入INTO map_info(author_id,author_time,map_theme,map_prefix_id,map_suffix_id,map_identifier_index)从map_info 中选择3、0、1、7、3,COALESCE(MAX(map_identifier_index)+ 1,1),其中map_theme = 1 ;
还有:
看起来唯一改变的是主题。
您的查询将导致仅基于map_theme列生成增量索引。为了使您的决定基于更多列,他们需要在where子句中添加
主题为1,前缀为7,后缀为3,要插入的地图标识符将自动递增为2,因为已经存在具有相同主题,前缀和后缀组合的地图
因此,您的查询将需要查找包含所有具有所有这些值的列的其他行:
INSERT INTO map_info (author_id, author_time, map_theme, map_prefix_id, map_suffix_id, map_identifier_index)
SELECT 3, 0, 1, 7, 3, COALESCE(MAX(map_identifier_index) + 1, 1) from map_info
where
map_theme = 1 and
map_prefix_id = 7 and
map_suffix_id = 3
这样,只有在存在具有所有这些属性的另一条记录时,索引才会滚动