PRIMARY KEY (`user_id`,`role_id`) USING BTREE 作用
时间: 2023-11-21 22:58:34 浏览: 154
`PRIMARY KEY (`user_id`,`role_id`) USING BTREE` 是一个MySQL中创建表时的语句,它的作用是将`user_id`和`role_id`两列作为联合主键,并使用B树索引进行优化。这样可以提高查询效率,因为B树索引可以快速定位到符合条件的记录,而不需要全表扫描。同时,联合主键可以保证表中每个记录的唯一性,避免了数据冗余和错误。
相关问题
分析下面的表CREATE TABLE `t_sys_role_menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '关联id', `role_id` bigint(20) NOT NULL COMMENT '角色id', `menu_id` bigint(20) UNSIGNED NOT NULL COMMENT '菜单id', `create_user_id` bigint(20) NULL DEFAULT NULL COMMENT '创建用户id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_user_id` bigint(20) NULL DEFAULT NULL COMMENT '更新用户id', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uni_user_role`(`role_id`, `menu_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 152 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色和菜单关联信息表' ROW_FORMAT = Dynamic;
这是一个 MySQL 数据库表的创建语句,表名为 `t_sys_role_menu`,包含了以下列:
- `id`:bigint 类型,自增主键,用于唯一标识每一条记录。
- `role_id`:bigint 类型,非空,表示关联的角色 ID。
- `menu_id`:bigint 类型,非空,表示关联的菜单 ID。
- `create_user_id`:bigint 类型,可空,表示创建该记录的用户 ID。
- `create_time`:datetime 类型,非空,默认值为当前时间,表示该记录的创建时间。
- `update_user_id`:bigint 类型,可空,表示最后更新该记录的用户 ID。
- `update_time`:datetime 类型,非空,默认值为当前时间,表示该记录的最后更新时间。
该表使用 InnoDB 引擎,使用 UTF-8 编码,采用 UTF-8_GENERAL_CI 作为字符集,行格式为 Dynamic。其中,`uni_user_role` 是一个唯一索引,由 `role_id` 和 `menu_id` 两列组成,用于保证同一个角色和菜单只有一条记录。该表用于存储角色和菜单之间的关联信息。
CREATE TABLE user ( id varchar(30) NOT NULL COMMENT '用户 openid', session_key varchar(30) DEFAULT NULL COMMENT '用户 session_key', role int(2) DEFAULT NULL COMMENT '角色类型 1是用户,2是员工', phone_number varchar(20) DEFAULT NULL COMMENT '用户手机号', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY open_id_UNIQUE (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; CREATE TABLE advert ( id int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', position_id int(3) NOT NULL COMMENT '广告位置ID', media_id int(20) NOT NULL COMMENT '广告图片ID', start_date datetime NOT NULL COMMENT '开始日期', end_date datetime NOT NULL COMMENT '结束日期', link varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', status int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id) USING BTREE, KEY FK_ad_image (media_id), KEY FK_ad_position (position_id), CONSTRAINT FK_ad_image FOREIGN KEY (media_id) REFERENCES media_file (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_ad_position FOREIGN KEY (position_id) REFERENCES ad_position (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表'; CREATE TABLE advert_click ( id int(10) NOT NULL AUTO_INCREMENT, advert_id int(10) NOT NULL COMMENT '广告ID', user_id varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '用户IP', click_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '点击时间', PRIMARY KEY (id), KEY FK_advert_id (advert_id), KEY FK_user_id (user_id), CONSTRAINT FK_advert_id FOREIGN KEY (advert_id) REFERENCES advert (id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT FK_user_id FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告点击表'; 报错cannot add foreign key constraint,这是为什么
这个错误通常是由于外键约束不正确导致的。在创建外键约束时,需要确保引用表和被引用表的数据类型和字符集匹配,以及被引用表的主键或唯一键上存在一个索引。还需要确保引用表和被引用表的存储引擎相同。在这个问题中,您可以检查以下几点:
1. 确保被引用表和引用表的数据类型和字符集匹配。
2. 确保被引用表的主键或唯一键上存在一个索引。
3. 确保被引用表和引用表的存储引擎相同。
4. 确保被引用表和引用表的数据类型和字符集都是 utf8mb4。
如果仍然存在问题,您可以检查 MySQL 错误日志以获取更多信息。
阅读全文