方案 使用連表查詢解決 單獨創建一個rfid的表 讓tool_id對應多個rfid
需要優化的表 ? 1:tool_materials_stock ? ? ? 庫存管理 ? ? ? ? 已完成 數據遷移完成 原庫rfid字段未刪除
? ? ? ? ? ? ? 2:tool_borrow_return ? ? ? ? 借出借還管理 ? ? 已完成
? ? ? ? ? ? ? 3:tool_materials_inspection ?質檢管理 ? ? ? ? 已完成
? ? ? ? ? ? ? 4:tool_materials_maintain ? ?維修信息 ? ? ? ? 已完成 ?
? ? ? ? ? ? ? 5:tool_materials_scrap ? ? ? 報廢管理 ? ? ? ? 已完成
? ? ? ? ? ? ? 6: ? ? ? ? ? ? ? ? ? ? ? ? ? 到期提醒 ? ? ? ? 已完成
?
-- 連表查詢的 tool_materials_stock_rfid 表
CREATE TABLE `tool_materials_stock_rfid` (
? `id` int NOT NULL AUTO_INCREMENT COMMENT 'RFID記錄ID',
? `tool_id` int NOT NULL COMMENT '工具ID(外鍵)',
? `rfid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工具RFID',
? PRIMARY KEY (`id`) USING BTREE,
? CONSTRAINT `fk_tool_id` FOREIGN KEY (`tool_id`) REFERENCES `tool_materials_stock` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='工具庫存RFID關聯表';
?
-- 連表查詢后的原tool_materials_stock 表
-- 1. 首先修改原表結構(移除rfid字段)
CREATE TABLE `tool_materials_stock` (
? `id` int NOT NULL AUTO_INCREMENT COMMENT '工具id',
? `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '工具名稱',
? `maintenance_status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '維護狀態(zc:正常 dzj:待質檢 ?zjz:質檢中 ?wxz:維修中)',
? `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '狀態(zk:在庫 jy:借用 ybf:報廢)',
? `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '工具編碼',
? -- 移除 rfid 字段,因為已經遷移到關聯表
? `classification_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工具分類id',
? `classification_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '工具分類編碼',
? `classification_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '工具分類名稱',
? `warehouse_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '倉庫id',
? `warehouse_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '倉庫編碼',
? `warehouse_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '倉庫名稱',
? `new_inspection_time` datetime DEFAULT NULL COMMENT '最新質檢時間',
? `next_inspection_time` datetime DEFAULT NULL COMMENT '下次質檢時間',
? `expected_return_time` datetime DEFAULT NULL COMMENT '預計歸還時間',
? `new_renew_time` datetime DEFAULT NULL COMMENT '最新更新時間(借出/歸還時間)',
? `update_time` datetime DEFAULT NULL COMMENT '修改時間',
? `update_user_id` int DEFAULT NULL COMMENT '修改人',
? `create_time` datetime DEFAULT NULL COMMENT '創建時間',
? `create_user_id` int DEFAULT NULL COMMENT '創建人',
? `attribute1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段1',
? `attribute2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段2',
? `attribute3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段3',
? `attribute4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段4',
? `attribute5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段5',
? `attribute6` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段6',
? `attribute7` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段7',
? `attribute8` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段8',
? `attribute9` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段9',
? `attribute10` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '拓展字段10',
? `belong_group` int DEFAULT NULL COMMENT '集團ID',
? `business_company` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '業務公司',
? PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=437 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='工具庫存表';
?
-- 測試數據集
-- 1. 先查看主表的結構,確保我們插入必要的字段
DESC tool_materials_stock;
-- 2. 插入主表數據(添加rfid字段)
INSERT INTO tool_materials_stock
(name, status, maintenance_status, code, rfid, classification_id, classification_code,
warehouse_id, warehouse_code, belong_group, create_time, update_time)
VALUES
('測試工具1', 'normal', 'normal', 'TOOL001', 'TEMP001', '1', 'CL001', '1', 'WH001', 1, NOW(), NOW()),
('測試工具2', 'normal', 'normal', 'TOOL002', 'TEMP002', '1', 'CL001', '1', 'WH001', 1, NOW(), NOW());
-- 3. 獲取插入的ID
SELECT id, name FROM tool_materials_stock WHERE code IN ('TOOL001', 'TOOL002');
-- 4. 使用查詢到的實際ID插入RFID關聯表數據
INSERT INTO tool_materials_stock_rfid
(tool_id, rfid)
VALUES
(437, 'RFID001'),
(437, 'RFID002'),
(438, 'RFID003');
-- 5. 驗證查詢
SELECT
? ? tmew.id,
? ? tmew.name,
? ? tmew.code,
? ? GROUP_CONCAT(tmsr.rfid) as rfid
FROM tool_materials_stock as tmew
LEFT JOIN tool_materials_stock_rfid tmsr ON tmew.id = tmsr.tool_id
WHERE tmew.belong_group = 1
GROUP BY tmew.id, tmew.name, tmew.code;
?
-- 原表中的rfid加載到新表中
-- 1. 首先將原表中的rfid數據遷移到新表
INSERT INTO tool_materials_stock_rfid (tool_id, rfid)
SELECT id, rfid
FROM tool_materials_stock
WHERE rfid IS NOT NULL
AND rfid != ''
AND rfid NOT IN (
? ? -- 防止重復插入已存在的RFID
? ? SELECT rfid FROM tool_materials_stock_rfid
);
-- 2. 驗證數據遷移是否成功
SELECT
? ? t.id,
? ? t.name,
? ? t.code,
? ? t.rfid as old_rfid,
? ? GROUP_CONCAT(r.rfid) as new_rfid
FROM tool_materials_stock t
LEFT JOIN tool_materials_stock_rfid r ON t.id = r.tool_id
WHERE t.rfid IS NOT NULL
AND t.rfid != ''
GROUP BY t.id, t.name, t.code, t.rfid;
-- 3. 確認數據無誤后,可以刪除原表的rfid字段
-- ALTER TABLE tool_materials_stock DROP COLUMN rfid;
?