Cloud Spanner交错表唯一索引冲突原因咨询
Cloud Spanner交错表唯一索引冲突问题解答
错误根源
你触发的错误并非来自表的主键约束,而是来自一个名为IDX_Songs_songId_U_1A1B6C1202613A13的全局唯一索引:
Query failed: Unique index violation on index IDX_Songs_songId_U_1A1B6C1202613A13 at index key [song1,singer1,album1]. It conflicts with row [song1,singer1,album1] in table Songs.
这个索引被设置为要求songId在整个Songs表中唯一——不管对应的歌手或专辑是什么,只要songId重复就会触发冲突。错误信息里的[song1,singer1,album1]是索引条目包含的主键列(用于定位冲突行),但唯一性约束的核心是songId的全局唯一性。
交错表的主键规则(针对你的疑问)
根据你提供的DDL,交错表的主键设计是合理的,不存在“父键不同时子键必须全局唯一”的要求:
- Singers表:主键为
singerId,确保每个歌手ID唯一。 - Albums表:主键为
(singerId, albumId),仅要求同一歌手下的专辑ID唯一,不同歌手完全可以使用相同的albumId。 - Songs表:主键为
(singerId, albumId, songId),仅要求同一歌手同一专辑下的歌曲ID唯一,不同歌手/专辑下的songId完全可以重复,只要三者组合不重复即可。
所以[singer1,album1,song1]和[singer2,album1,song1]是两个完全合法的不同主键,本身不会冲突,冲突只来自那个额外的songId全局唯一索引。
解决方法
如果你的业务逻辑允许不同歌手/专辑下存在相同songId,只需删除该全局唯一索引:
DROP INDEX IDX_Songs_songId_U_1A1B6C1202613A13 ON Songs;
内容的提问来源于stack exchange,提问作者Stinkybadger
相关产品推荐
相关产品推荐

