mysql查詢使用_rowid虛擬列的示例
在 MySQL 中,_rowid
是一個虛擬列,可以用來查詢 InnoDB 表的內(nèi)部行 ID(當表沒有顯式定義主鍵時)。以下是使用 _rowid
的 SQL 查詢示例:
1. 基本查詢(適用于沒有主鍵的表)
SELECT _rowid AS internal_row_id, -- 顯示內(nèi)部行ID t.* -- 查詢所有列 FROM your_table_name t LIMIT 10;
2. 檢查表是否支持 _rowid
-- 檢查表是否有主鍵或唯一索引 SHOW INDEX FROM your_table_name; -- 如果表沒有主鍵,且至少有一個非空的唯一整數(shù)列,`_rowid` 會指向該列 -- 否則,MySQL 會使用內(nèi)部隱藏的 rowid
3. 注意事項
_rowid
的限制:- 僅適用于 InnoDB 表。
- 如果表有主鍵,
_rowid
會指向主鍵列。 - 如果表沒有主鍵但有唯一非空整數(shù)列,
_rowid
會指向該列。 - 如果表既沒有主鍵也沒有唯一非空整數(shù)列,
_rowid
會顯示內(nèi)部隱藏的行 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
。 - 避免依賴內(nèi)部行 ID:
_rowid
可能因數(shù)據(jù)重組(如OPTIMIZE TABLE
)而變化,不適合用作業(yè)務(wù)邏輯。
補充:MySQL 根據(jù)時間自動創(chuàng)建分區(qū)腳本
以下是一個MySQL腳本示例,用于根據(jù)時間自動創(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個月的數(shù)據(jù)) /* 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ū) -- 啟用事件調(diào)度器 SET GLOBAL event_scheduler = ON;
到此這篇關(guān)于mysql查詢使用_rowid虛擬列的文章就介紹到這了,更多相關(guān)mysql查詢_rowid虛擬列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql基礎(chǔ)架構(gòu)教程之查詢語句執(zhí)行的流程詳解
這篇文章主要給大家介紹了關(guān)于mysql基礎(chǔ)架構(gòu)教程之查詢語句執(zhí)行流程的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-11-11MySQL中的log_bin_trust_function_creators系統(tǒng)變量
本文主要介紹了MySQL中的log_bin_trust_function_creators系統(tǒng)變量,log_bin_trust_function_creators是一個全局系統(tǒng)變量,下面就來介紹一下具體使用,感興趣的可以了解一下2024-09-09MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問題解讀
這篇文章主要介紹了MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09MySQL數(shù)據(jù)庫實現(xiàn)高可用架構(gòu)之MHA的實戰(zhàn)
本文主要介紹了MySQL數(shù)據(jù)庫實現(xiàn)高可用架構(gòu)之MHA的實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02MySQL中多個left?join?on關(guān)聯(lián)條件的順序說明
這篇文章主要介紹了MySQL中多個left?join?on關(guān)聯(lián)條件的順序說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11mysql8.0 windows x64 zip包安裝配置教程
這篇文章主要為大家詳細介紹了mysql8.0 windows x64 zip包安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Windows下MySQL8.0.11社區(qū)綠色版安裝步驟圖解
在本教程中使用MySQL最新的MySQL服務(wù)8.0.11的社區(qū)綠色版本進行安裝,綠色版為zip格式的包,安裝步驟分為四大步驟,具體哪四大步驟大家跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05分析Mysql大量數(shù)據(jù)導(dǎo)入遇到的問題以及解決方案
這篇文章主要介紹了Mysql大量數(shù)據(jù)導(dǎo)入遇到的問題以及解決方案,希望我們整理的內(nèi)容能夠幫助到大家。2018-02-02mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法分析
這篇文章主要介紹了mysql存儲過程之循環(huán)語句(WHILE,REPEAT和LOOP)用法,結(jié)合實例形式分析了mysql存儲過程循環(huán)語句WHILE,REPEAT和LOOP的原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-12-12