mysql查詢使用_rowid虛擬列的示例
在 MySQL 中,_rowid 是一個虛擬列,可以用來查詢 InnoDB 表的內部行 ID(當表沒有顯式定義主鍵時)。以下是使用 _rowid 的 SQL 查詢示例:
1. 基本查詢(適用于沒有主鍵的表)
SELECT
_rowid AS internal_row_id, -- 顯示內部行ID
t.* -- 查詢所有列
FROM your_table_name t
LIMIT 10;2. 檢查表是否支持 _rowid
-- 檢查表是否有主鍵或唯一索引 SHOW INDEX FROM your_table_name; -- 如果表沒有主鍵,且至少有一個非空的唯一整數列,`_rowid` 會指向該列 -- 否則,MySQL 會使用內部隱藏的 rowid

3. 注意事項
_rowid的限制:- 僅適用于 InnoDB 表。
- 如果表有主鍵,
_rowid會指向主鍵列。 - 如果表沒有主鍵但有唯一非空整數列,
_rowid會指向該列。 - 如果表既沒有主鍵也沒有唯一非空整數列,
_rowid會顯示內部隱藏的行 ID(但可能不穩(wěn)定,不建議依賴它)。
替代方案:
如果 _rowid 不可用,可以使用 ROW_NUMBER()(MySQL 8.0+):
SELECT
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num,
other_columns
FROM your_table_name;或者使用變量模擬行號(MySQL 5.7+):
SET @row_number = 0;
SELECT
(@row_number:=@row_number + 1) AS row_num,
other_columns
FROM your_table_name;4. 最佳實踐
- 顯式定義主鍵:建議在表中添加
id INT AUTO_INCREMENT PRIMARY KEY,避免依賴_rowid。 - 避免依賴內部行 ID:
_rowid可能因數據重組(如OPTIMIZE TABLE)而變化,不適合用作業(yè)務邏輯。
補充:MySQL 根據時間自動創(chuàng)建分區(qū)腳本
以下是一個MySQL腳本示例,用于根據時間自動創(chuàng)建和管理分區(qū)表:
-- 1. 首先創(chuàng)建一個按時間分區(qū)的表(如果尚未存在)
CREATE TABLE IF NOT EXISTS time_partitioned_data (
id INT AUTO_INCREMENT,
data_value VARCHAR(255),
created_at DATETIME NOT NULL,
PRIMARY KEY (id, created_at)
)
PARTITION BY RANGE (TO_DAYS(created_at)) (
PARTITION p_min VALUES LESS THAN (TO_DAYS('2023-01-01'))
);
-- 2. 創(chuàng)建存儲過程來自動管理分區(qū)
DELIMITER //
CREATE PROCEDURE auto_manage_partitions(IN table_name VARCHAR(64), IN days_ahead INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE partition_name VARCHAR(64);
DECLARE partition_value VARCHAR(64);
DECLARE max_value DATE;
DECLARE new_partition_date DATE;
DECLARE new_partition_name VARCHAR(64);
DECLARE new_partition_value INT;
DECLARE alter_sql TEXT;
-- 獲取當前最大分區(qū)值
SELECT MAX(TO_DAYS(created_at)) INTO @max_day
FROM time_partitioned_data;
SET max_value = IFNULL(FROM_DAYS(@max_day), CURDATE());
-- 創(chuàng)建未來分區(qū)
SET new_partition_date = max_value;
WHILE DATEDIFF(DATE_ADD(new_partition_date, INTERVAL 1 MONTH), max_value) <= days_ahead DO
SET new_partition_date = DATE_ADD(new_partition_date, INTERVAL 1 MONTH);
SET new_partition_name = CONCAT('p_', DATE_FORMAT(new_partition_date, '%Y%m'));
SET new_partition_value = TO_DAYS(new_partition_date);
-- 檢查分區(qū)是否已存在
SELECT COUNT(*) INTO @partition_exists
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'time_partitioned_data'
AND PARTITION_NAME = new_partition_name;
IF @partition_exists = 0 THEN
SET alter_sql = CONCAT('ALTER TABLE ', table_name,
' ADD PARTITION (PARTITION ', new_partition_name,
' VALUES LESS THAN (', new_partition_value, '))');
PREPARE stmt FROM alter_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Created partition: ', new_partition_name, ' for date: ', new_partition_date) AS message;
END IF;
END WHILE;
-- 可選:刪除舊分區(qū)(例如保留最近12個月的數據)
/*
SELECT PARTITION_NAME, PARTITION_DESCRIPTION INTO @old_partition, @old_value
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'time_partitioned_data'
AND PARTITION_NAME != 'p_min'
ORDER BY PARTITION_DESCRIPTION ASC
LIMIT 1;
IF TO_DAYS(CURDATE()) - @old_value > 365 THEN
SET @drop_sql = CONCAT('ALTER TABLE ', table_name, ' DROP PARTITION ', @old_partition);
PREPARE stmt FROM @drop_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT CONCAT('Dropped old partition: ', @old_partition) AS message;
END IF;
*/
END //
DELIMITER ;
-- 3. 創(chuàng)建事件定期執(zhí)行分區(qū)管理
CREATE EVENT IF NOT EXISTS manage_partitions_event
ON SCHEDULE EVERY 1 MONTH
STARTS CURRENT_TIMESTAMP
DO
CALL auto_manage_partitions('time_partitioned_data', 90); -- 提前創(chuàng)建未來90天的分區(qū)
-- 啟用事件調度器
SET GLOBAL event_scheduler = ON;到此這篇關于mysql查詢使用_rowid虛擬列的文章就介紹到這了,更多相關mysql查詢_rowid虛擬列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL中的log_bin_trust_function_creators系統變量
本文主要介紹了MySQL中的log_bin_trust_function_creators系統變量,log_bin_trust_function_creators是一個全局系統變量,下面就來介紹一下具體使用,感興趣的可以了解一下2024-09-09
mysql8.0 windows x64 zip包安裝配置教程
這篇文章主要為大家詳細介紹了mysql8.0 windows x64 zip包安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Windows下MySQL8.0.11社區(qū)綠色版安裝步驟圖解
在本教程中使用MySQL最新的MySQL服務8.0.11的社區(qū)綠色版本進行安裝,綠色版為zip格式的包,安裝步驟分為四大步驟,具體哪四大步驟大家跟隨腳本之家小編一起學習吧2018-05-05
mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析
這篇文章主要介紹了mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法,結合實例形式分析了mysql存儲過程循環(huán)語句WHILE,REPEAT和LOOP的原理、用法及相關操作注意事項,需要的朋友可以參考下2019-12-12

