PostgreSQL表名超長踩坑記
你以為的PostgreSQL支持的表名最長長度是多少?256個字符?512個字符?
這里先賣個關(guān)子。
大家是否還記得之前流傳的Linux中 rm -rf ${LOG_DIR}/命令的一個梗,由于未傳參LOG_DIR變成了空值,于是執(zhí)行的命令就變成了rm -rf /,然后服務(wù)器根目錄就被刪除了個干干凈凈。
我也犯了類似的錯誤,我要把一個過期的日志表給刪除,由于表名超長了,并且被截斷執(zhí)行了,導(dǎo)致不該刪除的表也被刪除了。
模擬重現(xiàn)步驟如下:
第一步
創(chuàng)建模擬的正式表
-- 正式表建表語句 create table t_loooooooooooooooooooooooooooooooooooooooooong_name (name varchar(10));
第二步
將正式表重命名為備份表。
alter table t_loooooooooooooooooooooooooooooooooooooooooong_name rename to t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_20260303;
執(zhí)行時,你會發(fā)現(xiàn),居然成功執(zhí)行了??墒?,再仔細(xì)一看,怎么還有提示:
identifier "t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_20260303" will be truncated to "t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_202603"
第三步
根據(jù)備份表,重建一張正式表。你猜,這一步會成功執(zhí)行嗎?
答案是會的,并且會出現(xiàn)和第二步一樣的提示。
create table t_loooooooooooooooooooooooooooooooooooooooooong_name (like t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_20260303 including all);
第四步,重要的一步來了
假設(shè)我要滾動刪除20260302那天的備份表,這里有一個隱含邏輯是20260302暫時還不存在,因為這是個新邏輯。
執(zhí)行下面的SQL命令:
drop table t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_20260302;
結(jié)果你應(yīng)該能想到,又被截斷執(zhí)行了。并且把表t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_202603刪除了。也就是說,這個表剛剛備份出來就被刪除了。
結(jié)論
來看一下,截斷后的表名有多長。測試SQL如下:
select length('t_loooooooooooooooooooooooooooooooooooooooooong_name_bak_202603');
length|
------+
63|
想不到吧,只有63個字符。
總結(jié)
關(guān)于這個特性,官方文檔Identifiers and Key Words一節(jié)是有說明的,原文如下:
The system uses no more than NAMEDATALEN-1 bytes of an identifier; longer names can be written in commands, but they will be truncated. By default, NAMEDATALEN is 64 so the maximum identifier length is 63 bytes. If this limit is problematic, it can be raised by changing the NAMEDATALEN constant in src/include/pg_config_manual.h.
大意是標(biāo)識符字節(jié)數(shù)不超過 NAMEDATALEN-1,具體是多少?就是 64-1=63。
需要注意的是,原文中提及了對于多字節(jié)字符,比如中文名稱,肯定達(dá)不到63,因為是按字節(jié)數(shù)算的。
我可以修改配置嗎?增大范圍。
不好意思,改不了,這個是編譯期常量。如果你要自己編譯一個版本是可以的。上面的原文引用已經(jīng)列出的源碼的修改位置了。
注意:官方說的是標(biāo)識符,沒說表名。也就是說類似,字段名、視圖名等等都是適用的。
參考
PostgreSQL: Documentation: 18: 4.1. Lexical Structure
到此這篇關(guān)于PostgreSQL表名超長踩坑記的文章就介紹到這了,更多相關(guān)PostgreSQL表名超長內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql中wal_level的三個參數(shù)用法說明
這篇文章主要介紹了postgresql中wal_level的三個參數(shù)用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
postgresql 查看當(dāng)前用戶名的實現(xiàn)
這篇文章主要介紹了postgresql 查看當(dāng)前用戶名的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL?流復(fù)制配置環(huán)境搭建過程
PostgreSQL 流復(fù)制是 9.0 提供的一種新的 WAL 傳遞方法,使用流復(fù)制時,每當(dāng) Primary 節(jié)點 WAL 產(chǎn)生,就會馬上傳遞到 Standby 節(jié)點,流復(fù)制提供異步和同步兩種模式,同步模式可以保障數(shù)據(jù) 0 丟失,這篇文章主要介紹了PostgreSQL?流復(fù)制搭建,需要的朋友可以參考下2023-09-09
Windows下Postgresql數(shù)據(jù)庫的下載與配置方法
這篇文章主要介紹了Windows下Postgresql數(shù)據(jù)庫的下載與配置方法 ,需要的朋友可以參考下2014-06-06
深入解讀PostgreSQL中的序列及其相關(guān)函數(shù)的用法
這篇文章主要介紹了PostgreSQL中的序列及其相關(guān)函數(shù)的用法,包括序列的更新和刪除等重要知識,需要的朋友可以參考下2016-01-01
postgresql 中的COALESCE()函數(shù)使用小技巧
這篇文章主要介紹了postgresql 中的COALESCE()函數(shù)使用小技巧,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
postgresql關(guān)于like%xxx%的優(yōu)化操作
這篇文章主要介紹了postgresql關(guān)于like%xxx%的優(yōu)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

