合并商品编号迁移

This commit is contained in:
yml
2026-06-08 20:12:18 +08:00
parent 494b2c068a
commit 830cfcf33d
4 changed files with 69 additions and 48 deletions
+10
View File
@@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS game_accounts (
-- 租号商品列表:用户发布的出租商品 -- 租号商品列表:用户发布的出租商品
CREATE TABLE IF NOT EXISTS rental_listings ( CREATE TABLE IF NOT EXISTS rental_listings (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
listing_no VARCHAR(20) NOT NULL COMMENT '商品编号,格式yyyyMMddNNNN',
account_id BIGINT UNSIGNED NOT NULL COMMENT '关联的游戏账号ID', account_id BIGINT UNSIGNED NOT NULL COMMENT '关联的游戏账号ID',
owner_id BIGINT UNSIGNED NOT NULL COMMENT '号主ID', owner_id BIGINT UNSIGNED NOT NULL COMMENT '号主ID',
price DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '租金(元/小时)', price DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '租金(元/小时)',
@@ -86,12 +87,21 @@ CREATE TABLE IF NOT EXISTS rental_listings (
published_at DATETIME NULL COMMENT '发布时间', published_at DATETIME NULL COMMENT '发布时间',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_rental_listings_listing_no (listing_no),
KEY idx_rental_listings_account_id (account_id), KEY idx_rental_listings_account_id (account_id),
KEY idx_rental_listings_owner_id (owner_id), KEY idx_rental_listings_owner_id (owner_id),
KEY idx_rental_listings_filter (status, review_status, in_transaction, price), KEY idx_rental_listings_filter (status, review_status, in_transaction, price),
KEY idx_rental_listings_published (status, review_status, published_at DESC) KEY idx_rental_listings_published (status, review_status, published_at DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租号商品列表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租号商品列表';
-- 商品编号日序列表:记录每天已分配的最大序号
CREATE TABLE IF NOT EXISTS listing_no_sequences (
biz_date CHAR(8) PRIMARY KEY COMMENT '业务日期yyyyMMdd',
next_seq INT NOT NULL DEFAULT 0 COMMENT '当日已分配最大序号',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品编号日序列表';
-- ------------------------------------------- -- -------------------------------------------
-- 订单相关表 -- 订单相关表
-- ------------------------------------------- -- -------------------------------------------
@@ -1,33 +0,0 @@
-- 商品编号:用于前台展示、搜索和客服定位
ALTER TABLE rental_listings
ADD COLUMN listing_no VARCHAR(20) NULL COMMENT '商品编号,格式yyyyMMddNNNN' AFTER id;
UPDATE rental_listings AS l
JOIN (
SELECT
id,
CONCAT(
DATE_FORMAT(created_at, '%Y%m%d'),
LPAD(ROW_NUMBER() OVER (PARTITION BY DATE(created_at) ORDER BY id), 4, '0')
) AS generated_listing_no
FROM rental_listings
) AS seq ON seq.id = l.id
SET l.listing_no = seq.generated_listing_no
WHERE l.listing_no IS NULL OR l.listing_no = '';
ALTER TABLE rental_listings
MODIFY COLUMN listing_no VARCHAR(20) NOT NULL COMMENT '商品编号,格式yyyyMMddNNNN',
ADD UNIQUE KEY uk_rental_listings_listing_no (listing_no);
CREATE TABLE IF NOT EXISTS listing_no_sequences (
biz_date CHAR(8) PRIMARY KEY COMMENT '业务日期yyyyMMdd',
next_seq INT NOT NULL DEFAULT 0 COMMENT '当日已分配最大序号',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品编号日序列表';
INSERT INTO listing_no_sequences (biz_date, next_seq)
SELECT DATE_FORMAT(created_at, '%Y%m%d') AS biz_date, COUNT(*) AS next_seq
FROM rental_listings
GROUP BY DATE_FORMAT(created_at, '%Y%m%d')
ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq));
+11 -1
View File
@@ -150,9 +150,13 @@ BEGIN
SET deposit_val = 100.00 + (i % 10) * 50.00; SET deposit_val = 100.00 + (i % 10) * 50.00;
INSERT INTO rental_listings ( INSERT INTO rental_listings (
account_id, owner_id, price, deposit_amount, listing_no, account_id, owner_id, price, deposit_amount,
in_transaction, status, review_status, published_at in_transaction, status, review_status, published_at
) VALUES ( ) VALUES (
CONCAT(
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL (i % 90) DAY), '%Y%m%d'),
LPAD(FLOOR((i - 1) / 90) + 1, 4, '0')
),
account_id_val, account_id_val,
user_id_val, user_id_val,
price_val, price_val,
@@ -178,6 +182,12 @@ BEGIN
END IF; END IF;
END WHILE; END WHILE;
INSERT INTO listing_no_sequences (biz_date, next_seq)
SELECT LEFT(listing_no, 8), MAX(CAST(SUBSTRING(listing_no, 9) AS UNSIGNED))
FROM rental_listings
GROUP BY LEFT(listing_no, 8)
ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq));
COMMIT; COMMIT;
END$$ END$$
DELIMITER ; DELIMITER ;
+48 -14
View File
@@ -18,12 +18,14 @@ BEGIN
DECLARE current_batch INT DEFAULT 0; DECLARE current_batch INT DEFAULT 0;
DECLARE batch_start INT; DECLARE batch_start INT;
DECLARE batch_end INT; DECLARE batch_end INT;
DECLARE current_limit INT;
SET batches = CEIL(batch_size / batch_limit); SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO WHILE current_batch < batches DO
SET batch_start = current_batch * batch_limit + 1; SET batch_start = current_batch * batch_limit + 1;
SET batch_end = LEAST((current_batch + 1) * batch_limit, batch_size); SET batch_end = LEAST((current_batch + 1) * batch_limit, batch_size);
SET current_limit = batch_end - batch_start + 1;
-- 使用 INSERT ... SELECT 批量生成 -- 使用 INSERT ... SELECT 批量生成
INSERT INTO users (phone, nickname, realname_status, risk_status, credit_score, status, created_at) INSERT INTO users (phone, nickname, realname_status, risk_status, credit_score, status, created_at)
@@ -45,7 +47,7 @@ BEGIN
(SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 (SELECT 0 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) t3, UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT @row := batch_start - 1) r (SELECT @row := batch_start - 1) r
LIMIT batch_end - batch_start + 1 LIMIT current_limit
) seqs ) seqs
ON DUPLICATE KEY UPDATE id=id; ON DUPLICATE KEY UPDATE id=id;
@@ -90,6 +92,7 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000; DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT; DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0; DECLARE current_batch INT DEFAULT 0;
DECLARE verified_user_count INT DEFAULT 0;
-- 创建临时表存储已实名用户ID -- 创建临时表存储已实名用户ID
DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; DROP TEMPORARY TABLE IF EXISTS tmp_verified_users;
@@ -104,6 +107,8 @@ BEGIN
WHERE realname_status = 'verified' WHERE realname_status = 'verified'
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users;
SET batches = CEIL(batch_size / batch_limit); SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO WHILE current_batch < batches DO
@@ -149,15 +154,19 @@ BEGIN
(SELECT @row2 := current_batch * batch_limit) r (SELECT @row2 := current_batch * batch_limit) r
LIMIT batch_limit LIMIT batch_limit
) seqs ) seqs
INNER JOIN tmp_verified_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_verified_users)) + 1 INNER JOIN tmp_verified_users u ON u.row_num = (seq % verified_user_count) + 1
WHERE seq <= batch_size; WHERE seq <= batch_size;
-- 批量生成租号商品 -- 批量生成租号商品
INSERT INTO rental_listings ( INSERT INTO rental_listings (
account_id, owner_id, price, deposit_amount, listing_no, account_id, owner_id, price, deposit_amount,
in_transaction, status, review_status, published_at in_transaction, status, review_status, published_at
) )
SELECT SELECT
CONCAT(
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL (ga.id % 90) DAY), '%Y%m%d'),
LPAD(FLOOR((ga.id - 1) / 90) + 1, 4, '0')
) as listing_no,
ga.id as account_id, ga.id as account_id,
ga.owner_id, ga.owner_id,
5.00 + ((ga.id % 20) * 0.5) as price, 5.00 + ((ga.id % 20) * 0.5) as price,
@@ -182,6 +191,14 @@ BEGIN
COMMIT; COMMIT;
END WHILE; END WHILE;
INSERT INTO listing_no_sequences (biz_date, next_seq)
SELECT LEFT(listing_no, 8), MAX(CAST(SUBSTRING(listing_no, 9) AS UNSIGNED))
FROM rental_listings
GROUP BY LEFT(listing_no, 8)
ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq));
COMMIT;
DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; DROP TEMPORARY TABLE IF EXISTS tmp_verified_users;
END$$ END$$
DELIMITER ; DELIMITER ;
@@ -196,6 +213,8 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000; DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT; DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0; DECLARE current_batch INT DEFAULT 0;
DECLARE available_listing_count INT DEFAULT 0;
DECLARE verified_user_count INT DEFAULT 0;
-- 创建临时表:可用商品 -- 创建临时表:可用商品
DROP TEMPORARY TABLE IF EXISTS tmp_available_listings; DROP TEMPORARY TABLE IF EXISTS tmp_available_listings;
@@ -214,6 +233,8 @@ BEGIN
WHERE status IN ('published', 'active') AND review_status = 'approved' WHERE status IN ('published', 'active') AND review_status = 'approved'
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO available_listing_count FROM tmp_available_listings;
-- 创建临时表:已实名用户 -- 创建临时表:已实名用户
DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; DROP TEMPORARY TABLE IF EXISTS tmp_verified_users;
CREATE TEMPORARY TABLE tmp_verified_users ( CREATE TEMPORARY TABLE tmp_verified_users (
@@ -227,6 +248,8 @@ BEGIN
WHERE realname_status = 'verified' WHERE realname_status = 'verified'
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users;
SET batches = CEIL(batch_size / batch_limit); SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO WHILE current_batch < batches DO
@@ -278,8 +301,8 @@ BEGIN
(SELECT @row3 := current_batch * batch_limit) r (SELECT @row3 := current_batch * batch_limit) r
LIMIT batch_limit LIMIT batch_limit
) seqs ) seqs
INNER JOIN tmp_available_listings l ON l.row_num = (seq % (SELECT COUNT(*) FROM tmp_available_listings)) + 1 INNER JOIN tmp_available_listings l ON l.row_num = (seq % available_listing_count) + 1
INNER JOIN tmp_verified_users r ON r.row_num = (seq % (SELECT COUNT(*) FROM tmp_verified_users)) + 1 INNER JOIN tmp_verified_users r ON r.row_num = (seq % verified_user_count) + 1
WHERE seq <= batch_size AND r.id != l.owner_id WHERE seq <= batch_size AND r.id != l.owner_id
LIMIT batch_limit; LIMIT batch_limit;
@@ -302,6 +325,8 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000; DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT; DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0; DECLARE current_batch INT DEFAULT 0;
DECLARE user_count INT DEFAULT 0;
DECLARE order_count INT DEFAULT 0;
-- 创建临时表:用户列表 -- 创建临时表:用户列表
DROP TEMPORARY TABLE IF EXISTS tmp_users; DROP TEMPORARY TABLE IF EXISTS tmp_users;
@@ -315,6 +340,8 @@ BEGIN
FROM users, (SELECT @rn := 0) init FROM users, (SELECT @rn := 0) init
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO user_count FROM tmp_users;
-- 创建临时表:订单列表 -- 创建临时表:订单列表
DROP TEMPORARY TABLE IF EXISTS tmp_orders; DROP TEMPORARY TABLE IF EXISTS tmp_orders;
CREATE TEMPORARY TABLE tmp_orders ( CREATE TEMPORARY TABLE tmp_orders (
@@ -327,6 +354,8 @@ BEGIN
FROM rental_orders, (SELECT @rn2 := 0) init FROM rental_orders, (SELECT @rn2 := 0) init
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO order_count FROM tmp_orders;
SET batches = CEIL(batch_size / batch_limit); SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO WHILE current_batch < batches DO
@@ -365,8 +394,8 @@ BEGIN
(SELECT @row4 := current_batch * batch_limit) r (SELECT @row4 := current_batch * batch_limit) r
LIMIT batch_limit LIMIT batch_limit
) seqs ) seqs
INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1 INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1
LEFT JOIN tmp_orders o ON o.row_num = (seq % (SELECT COUNT(*) FROM tmp_orders)) + 1 LEFT JOIN tmp_orders o ON o.row_num = (seq % order_count) + 1
WHERE seq <= batch_size WHERE seq <= batch_size
LIMIT batch_limit; LIMIT batch_limit;
@@ -386,6 +415,12 @@ DROP PROCEDURE IF EXISTS generate_chat_data_batch;
DELIMITER $$ DELIMITER $$
CREATE PROCEDURE generate_chat_data_batch(IN message_count INT) CREATE PROCEDURE generate_chat_data_batch(IN message_count INT)
BEGIN BEGIN
DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0;
DECLARE conversation_count INT DEFAULT 0;
DECLARE user_count INT DEFAULT 0;
-- 先生成聊天会话(基于订单) -- 先生成聊天会话(基于订单)
INSERT INTO chat_conversations (order_id, type, title, status, last_message_at) INSERT INTO chat_conversations (order_id, type, title, status, last_message_at)
SELECT SELECT
@@ -399,11 +434,6 @@ BEGIN
LIMIT 1000 LIMIT 1000
ON DUPLICATE KEY UPDATE order_id=order_id; ON DUPLICATE KEY UPDATE order_id=order_id;
-- 批量生成聊天消息
DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0;
DROP TEMPORARY TABLE IF EXISTS tmp_conversations; DROP TEMPORARY TABLE IF EXISTS tmp_conversations;
CREATE TEMPORARY TABLE tmp_conversations ( CREATE TEMPORARY TABLE tmp_conversations (
id BIGINT PRIMARY KEY, id BIGINT PRIMARY KEY,
@@ -415,6 +445,8 @@ BEGIN
FROM chat_conversations, (SELECT @rn := 0) init FROM chat_conversations, (SELECT @rn := 0) init
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO conversation_count FROM tmp_conversations;
DROP TEMPORARY TABLE IF EXISTS tmp_users; DROP TEMPORARY TABLE IF EXISTS tmp_users;
CREATE TEMPORARY TABLE tmp_users ( CREATE TEMPORARY TABLE tmp_users (
id BIGINT PRIMARY KEY, id BIGINT PRIMARY KEY,
@@ -426,6 +458,8 @@ BEGIN
FROM users, (SELECT @rn2 := 0) init FROM users, (SELECT @rn2 := 0) init
ORDER BY id; ORDER BY id;
SELECT COUNT(*) INTO user_count FROM tmp_users;
SET batches = CEIL(message_count / batch_limit); SET batches = CEIL(message_count / batch_limit);
WHILE current_batch < batches DO WHILE current_batch < batches DO
@@ -453,8 +487,8 @@ BEGIN
(SELECT @row5 := current_batch * batch_limit) r (SELECT @row5 := current_batch * batch_limit) r
LIMIT batch_limit LIMIT batch_limit
) seqs ) seqs
INNER JOIN tmp_conversations c ON c.row_num = (seq % (SELECT COUNT(*) FROM tmp_conversations)) + 1 INNER JOIN tmp_conversations c ON c.row_num = (seq % conversation_count) + 1
INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1 INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1
WHERE seq <= message_count WHERE seq <= message_count
LIMIT batch_limit; LIMIT batch_limit;