-- 给缺少 ConcurrencyStamp 的 OMS 表补列(可重复执行) -- Fake AggregateRoot 自带该字段,SqlSugar 查询会带上;库表没有就会报: -- Unknown column 'ConcurrencyStamp' in 'field list' -- -- 注意:不要用 DEFAULT (UUID())。在 STATEMENT/MIXED 复制下会触发: -- 1674 Statement is unsafe because it uses a system function that may return a different value on the replica. -- 默认用固定 GUID;插入/更新时由 ORM 写入真实 UUID。 -- -- 用法:在业务库执行本脚本;若仍报错,把报错 SQL 里的表名追加到下方列表。 SET @tables := 't_order_stock_bind,C_inventory,C_parcel,C_parcel_item,C_parcel_arrival,C_sku,C_bin_location,C_inbound_notice,C_inbound_box,C_inbound_box_line,C_sku_platform_map,t_sales_store,t_sales_store_order,t_sales_store_order_line,t_customer_sender_address'; DROP PROCEDURE IF EXISTS sp_add_concurrency_stamp_if_missing; DELIMITER $$ CREATE PROCEDURE sp_add_concurrency_stamp_if_missing() BEGIN DECLARE done INT DEFAULT 0; DECLARE tname VARCHAR(128); DECLARE cur CURSOR FOR SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(@tables, ',', n.n), ',', -1)) AS t FROM ( SELECT a.N + b.N * 10 + 1 AS n FROM (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a, (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b ) n WHERE n.n <= 1 + (LENGTH(@tables) - LENGTH(REPLACE(@tables, ',', ''))); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; read_loop: LOOP FETCH cur INTO tname; IF done THEN LEAVE read_loop; END IF; IF tname IS NULL OR tname = '' THEN ITERATE read_loop; END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tname ) THEN ITERATE read_loop; END IF; IF NOT EXISTS ( SELECT 1 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = tname AND COLUMN_NAME = 'ConcurrencyStamp' ) THEN SET @ddl := CONCAT( 'ALTER TABLE `', tname, '` ADD COLUMN `ConcurrencyStamp` CHAR(36) NOT NULL DEFAULT ''00000000-0000-0000-0000-000000000000'' COMMENT ''并发戳''' ); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END LOOP; CLOSE cur; END$$ DELIMITER ; CALL sp_add_concurrency_stamp_if_missing(); DROP PROCEDURE IF EXISTS sp_add_concurrency_stamp_if_missing;