Commit f1e20216ce91aa1651cc1676f77b94b2c49a41dc
1 parent
b63ac3d2
chore(schema): switch boolean flag columns from TINYINT(1) to BIT(1)
V2 ALTERs all 6 b* columns across tUser/tStaff/tPermissionCategory/ tModule from TINYINT(1) to BIT(1). MySQL preserves data on the type change (0 → b'0', 1 → b'1') and indexes survive the modify. MyBatis-Plus entity Boolean fields and existing 'WHERE bDeleted = 0' queries continue to work — MySQL Connector/J 8.x maps BIT(1) ↔ Boolean automatically and accepts integer literals via implicit conversion. Verified: setup-test-db + mvn test → 149/149 pass with V2 applied. Also updates docs/03-数据库设计文档.md (schema SSoT) so the table descriptors say bit(1) instead of tinyint(1).
Showing
2 changed files
with
30 additions
and
6 deletions
docs/03-数据库设计文档.md
| ... | ... | @@ -56,11 +56,11 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply) |
| 56 | 56 | | `iStaffId` | int | 是 | NULL | 关联职员 ID(可选,外键 → `tStaff.iIncrement`) | |
| 57 | 57 | | `sUserType` | varchar(20) | 否 | `普通用户` | 用户类型;枚举:`普通用户` / `超级管理员` | |
| 58 | 58 | | `sLanguage` | varchar(10) | 否 | `zh` | 语言偏好;枚举:`zh` / `en` / `zh-TW` | |
| 59 | -| `bCanModifyDocs` | tinyint(1) | 否 | 0 | 单据修改权限;0 否 / 1 是 | | |
| 59 | +| `bCanModifyDocs` | bit(1) | 否 | 0 | 单据修改权限;0 否 / 1 是 | | |
| 60 | 60 | | `sPasswordHash` | varchar(255) | 否 | — | 密码哈希值(BCrypt 等强哈希算法),新增默认初始密码 `666666` 的哈希 | |
| 61 | 61 | | `tLastLoginDate` | datetime | 是 | NULL | 最后登录时间 | |
| 62 | 62 | | `sCreatedBy` | varchar(50) | 是 | — | 制单人(创建用户的操作员用户号) | |
| 63 | -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记;0 有效 / 1 已作废 | | |
| 63 | +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记;0 有效 / 1 已作废 | | |
| 64 | 64 | | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 | |
| 65 | 65 | | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 | |
| 66 | 66 | |
| ... | ... | @@ -100,7 +100,7 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply) |
| 100 | 100 | | `sStaffName` | varchar(50) | 否 | — | 职员姓名 | |
| 101 | 101 | | `sDepartment` | varchar(100) | 是 | NULL | 所属部门(本期暂用字符串,未来如需独立 `tDepartment` 字典表再另行重构) | |
| 102 | 102 | | `sCreatedBy` | varchar(50) | 是 | — | 制单人 | |
| 103 | -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 | | |
| 103 | +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 | | |
| 104 | 104 | | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 | |
| 105 | 105 | | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 | |
| 106 | 106 | |
| ... | ... | @@ -137,7 +137,7 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply) |
| 137 | 137 | | `iParentId` | int | 是 | NULL | 父分类 ID(自引用,根节点为 NULL) | |
| 138 | 138 | | `iSortOrder` | int | 否 | 0 | 同级排序号 | |
| 139 | 139 | | `sCreatedBy` | varchar(50) | 是 | — | 制单人 | |
| 140 | -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 | | |
| 140 | +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 | | |
| 141 | 141 | | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 | |
| 142 | 142 | | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 | |
| 143 | 143 | |
| ... | ... | @@ -204,12 +204,12 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply) |
| 204 | 204 | | `sProcedureName` | varchar(100) | 否 | — | 存储过程(审核)名称;系统内唯一 | |
| 205 | 205 | | `sModuleType` | varchar(50) | 否 | — | 模块类型(本期按自由文本处理,VARCHAR(50);如未来收敛到枚举再加 CHECK 约束) | |
| 206 | 206 | | `sManageDeptEn` | varchar(50) | 否 | — | 管理部门英文标识 | |
| 207 | -| `bShowPermission` | tinyint(1) | 否 | 0 | 权限是否显示;0 否 / 1 是 | | |
| 207 | +| `bShowPermission` | bit(1) | 否 | 0 | 权限是否显示;0 否 / 1 是 | | |
| 208 | 208 | | `sModuleNameZh` | varchar(100) | 否 | — | 界面名称(中文,模糊查询用) | |
| 209 | 209 | | `iParentId` | int | 是 | NULL | 父模块 ID(自引用,根节点为 NULL) | |
| 210 | 210 | | `iSortOrder` | int | 否 | 0 | 同级排序号 | |
| 211 | 211 | | `sCreatedBy` | varchar(50) | 是 | — | 制单人 | |
| 212 | -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 | | |
| 212 | +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 | | |
| 213 | 213 | | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 | |
| 214 | 214 | | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 | |
| 215 | 215 | ... | ... |
sql/migrations/V2__bool_columns_to_bit.sql
0 → 100644
| 1 | +-- Flyway migration V2 — switch boolean flag columns from TINYINT(1) to BIT(1). | |
| 2 | +-- | |
| 3 | +-- Why: BIT(1) gives strict 0/1 storage at the type level. MySQL Connector/J 8.x | |
| 4 | +-- maps BIT(1) ↔ Boolean automatically (no driver param needed). MyBatis-Plus | |
| 5 | +-- entity fields stay `Boolean`, no Java code changes required. Existing queries | |
| 6 | +-- like `WHERE bDeleted = 0` continue to work because MySQL implicitly converts | |
| 7 | +-- integer literals to bit values. | |
| 8 | +-- | |
| 9 | +-- ALTER TABLE on a populated table preserves data: TINYINT 0 → BIT b'0', | |
| 10 | +-- TINYINT 1 → BIT b'1'. Indexes (e.g. idx_deleted_login) survive the modify. | |
| 11 | + | |
| 12 | +ALTER TABLE `tUser` | |
| 13 | + MODIFY COLUMN `bCanModifyDocs` BIT(1) NOT NULL DEFAULT b'0' COMMENT '单据修改权限;0 否 / 1 是', | |
| 14 | + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记;0 有效 / 1 已作废'; | |
| 15 | + | |
| 16 | +ALTER TABLE `tStaff` | |
| 17 | + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记'; | |
| 18 | + | |
| 19 | +ALTER TABLE `tPermissionCategory` | |
| 20 | + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记'; | |
| 21 | + | |
| 22 | +ALTER TABLE `tModule` | |
| 23 | + MODIFY COLUMN `bShowPermission` BIT(1) NOT NULL DEFAULT b'0' COMMENT '权限是否显示;0 否 / 1 是', | |
| 24 | + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记'; | ... | ... |