导入database.sql至数据库服务器时遇错误,求排查方案
你的操作存在两个核心问题:
1. 误解主键约束要求,误用UNIQUE替代NOT NULL
主键(PRIMARY KEY)的强制规则是所有组成字段必须为非空,因为主键要唯一标识每一行记录,空值无法满足这个要求。你把DEFAULT NULL改成UNIQUE是完全错误的:
UNIQUE约束允许字段为空(最多存在一个空值),但无法满足主键的非空要求- 单独给
group_id和subscriber_id加UNIQUE,会导致每个字段的取值都不能重复,这违背了「一个分组可对应多个订阅者、一个订阅者可属于多个分组」的关联表设计逻辑
2. 索引命名重复,且存在冗余索引
- 给
group_id字段添加UNIQUE约束时,MySQL会自动生成一个名为group_id的单列唯一索引 - 你又显式定义了
UNIQUE KEYgroup_id(group_id,subscriber_id),这直接造成索引名重复,触发Duplicate key name 'group_id'错误 - 另外,
PRIMARY KEY (group_id,subscriber_id)本身就自带唯一约束,再定义相同字段组合的UNIQUE KEY属于完全冗余的操作
正确的修正方案
将两个字段的DEFAULT NULL改为NOT NULL,删除冗余的UNIQUE KEY,最终SQL如下:
DROP TABLE IF EXISTS `newsletter_groups_subscribers`; CREATE TABLE IF NOT EXISTS `newsletter_groups_subscribers` ( `group_id` int(10) unsigned NOT NULL, `subscriber_id` int(10) unsigned NOT NULL, PRIMARY KEY (`group_id`, `subscriber_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这样既满足主键的非空要求,通过组合主键保证group_id和subscriber_id的组合唯一,同时避免了索引冗余和命名冲突。
内容的提问来源于stack exchange,提问作者Colin Gordon
相关产品推荐
相关产品推荐

