合并商品编号迁移
This commit is contained in:
@@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS game_accounts (
|
||||
-- 租号商品列表:用户发布的出租商品
|
||||
CREATE TABLE IF NOT EXISTS rental_listings (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
listing_no VARCHAR(20) NOT NULL COMMENT '商品编号,格式yyyyMMddNNNN',
|
||||
account_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 '租金(元/小时)',
|
||||
@@ -86,12 +87,21 @@ CREATE TABLE IF NOT EXISTS rental_listings (
|
||||
published_at DATETIME NULL COMMENT '发布时间',
|
||||
created_at DATETIME NOT NULL DEFAULT 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_owner_id (owner_id),
|
||||
KEY idx_rental_listings_filter (status, review_status, in_transaction, price),
|
||||
KEY idx_rental_listings_published (status, review_status, published_at DESC)
|
||||
) 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));
|
||||
@@ -150,9 +150,13 @@ BEGIN
|
||||
SET deposit_val = 100.00 + (i % 10) * 50.00;
|
||||
|
||||
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
|
||||
) 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,
|
||||
user_id_val,
|
||||
price_val,
|
||||
@@ -178,6 +182,12 @@ BEGIN
|
||||
END IF;
|
||||
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;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user