合并商品编号迁移

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
+48 -14
View File
@@ -18,12 +18,14 @@ BEGIN
DECLARE current_batch INT DEFAULT 0;
DECLARE batch_start INT;
DECLARE batch_end INT;
DECLARE current_limit INT;
SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO
SET batch_start = current_batch * batch_limit + 1;
SET batch_end = LEAST((current_batch + 1) * batch_limit, batch_size);
SET current_limit = batch_end - batch_start + 1;
-- 使用 INSERT ... SELECT 批量生成
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
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT @row := batch_start - 1) r
LIMIT batch_end - batch_start + 1
LIMIT current_limit
) seqs
ON DUPLICATE KEY UPDATE id=id;
@@ -90,6 +92,7 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT;
DECLARE current_batch INT DEFAULT 0;
DECLARE verified_user_count INT DEFAULT 0;
-- 创建临时表存储已实名用户ID
DROP TEMPORARY TABLE IF EXISTS tmp_verified_users;
@@ -104,6 +107,8 @@ BEGIN
WHERE realname_status = 'verified'
ORDER BY id;
SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users;
SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO
@@ -149,15 +154,19 @@ BEGIN
(SELECT @row2 := current_batch * batch_limit) r
LIMIT batch_limit
) 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;
-- 批量生成租号商品
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
)
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.owner_id,
5.00 + ((ga.id % 20) * 0.5) as price,
@@ -182,6 +191,14 @@ BEGIN
COMMIT;
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;
END$$
DELIMITER ;
@@ -196,6 +213,8 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT;
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;
@@ -214,6 +233,8 @@ BEGIN
WHERE status IN ('published', 'active') AND review_status = 'approved'
ORDER BY id;
SELECT COUNT(*) INTO available_listing_count FROM tmp_available_listings;
-- 创建临时表:已实名用户
DROP TEMPORARY TABLE IF EXISTS tmp_verified_users;
CREATE TEMPORARY TABLE tmp_verified_users (
@@ -227,6 +248,8 @@ BEGIN
WHERE realname_status = 'verified'
ORDER BY id;
SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users;
SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO
@@ -278,8 +301,8 @@ BEGIN
(SELECT @row3 := current_batch * batch_limit) r
LIMIT batch_limit
) seqs
INNER JOIN tmp_available_listings l ON l.row_num = (seq % (SELECT COUNT(*) FROM tmp_available_listings)) + 1
INNER JOIN tmp_verified_users r ON r.row_num = (seq % (SELECT COUNT(*) FROM tmp_verified_users)) + 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 % verified_user_count) + 1
WHERE seq <= batch_size AND r.id != l.owner_id
LIMIT batch_limit;
@@ -302,6 +325,8 @@ BEGIN
DECLARE batch_limit INT DEFAULT 1000;
DECLARE batches INT;
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;
@@ -315,6 +340,8 @@ BEGIN
FROM users, (SELECT @rn := 0) init
ORDER BY id;
SELECT COUNT(*) INTO user_count FROM tmp_users;
-- 创建临时表:订单列表
DROP TEMPORARY TABLE IF EXISTS tmp_orders;
CREATE TEMPORARY TABLE tmp_orders (
@@ -327,6 +354,8 @@ BEGIN
FROM rental_orders, (SELECT @rn2 := 0) init
ORDER BY id;
SELECT COUNT(*) INTO order_count FROM tmp_orders;
SET batches = CEIL(batch_size / batch_limit);
WHILE current_batch < batches DO
@@ -365,8 +394,8 @@ BEGIN
(SELECT @row4 := current_batch * batch_limit) r
LIMIT batch_limit
) seqs
INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1
LEFT JOIN tmp_orders o ON o.row_num = (seq % (SELECT COUNT(*) FROM tmp_orders)) + 1
INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1
LEFT JOIN tmp_orders o ON o.row_num = (seq % order_count) + 1
WHERE seq <= batch_size
LIMIT batch_limit;
@@ -386,6 +415,12 @@ DROP PROCEDURE IF EXISTS generate_chat_data_batch;
DELIMITER $$
CREATE PROCEDURE generate_chat_data_batch(IN message_count INT)
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)
SELECT
@@ -399,11 +434,6 @@ BEGIN
LIMIT 1000
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;
CREATE TEMPORARY TABLE tmp_conversations (
id BIGINT PRIMARY KEY,
@@ -415,6 +445,8 @@ BEGIN
FROM chat_conversations, (SELECT @rn := 0) init
ORDER BY id;
SELECT COUNT(*) INTO conversation_count FROM tmp_conversations;
DROP TEMPORARY TABLE IF EXISTS tmp_users;
CREATE TEMPORARY TABLE tmp_users (
id BIGINT PRIMARY KEY,
@@ -426,6 +458,8 @@ BEGIN
FROM users, (SELECT @rn2 := 0) init
ORDER BY id;
SELECT COUNT(*) INTO user_count FROM tmp_users;
SET batches = CEIL(message_count / batch_limit);
WHILE current_batch < batches DO
@@ -453,8 +487,8 @@ BEGIN
(SELECT @row5 := current_batch * batch_limit) r
LIMIT batch_limit
) seqs
INNER JOIN tmp_conversations c ON c.row_num = (seq % (SELECT COUNT(*) FROM tmp_conversations)) + 1
INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1
INNER JOIN tmp_conversations c ON c.row_num = (seq % conversation_count) + 1
INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1
WHERE seq <= message_count
LIMIT batch_limit;