已弃用的功能
(最初来自 Thom Brown 的博客文章)
如果您长期使用 PostgreSQL,或者您是新手但一直遵循有关如何使用它的旧指令,那么您可能正在使用已弃用的功能。功能消失的原因通常是它们已被更好的功能取代,这些功能涵盖了相同的功能。重要的是尝试避免使用注定要消失的功能,如果存在更新的替代方案。此外,在计划升级时,了解您正在使用的功能是否会在新版本中突然中断非常有用。其中一些功能仍然可以工作,但已从文档中删除,因为它们将在未来的版本中被删除。其他功能已被完全删除。
我们将从极其古老的功能开始,逐步过渡到现在的功能。
版本 6.2
timetravel 扩展模块
它还能工作吗?: 不。这已经非常古老了,最后一次支持是在 PostgreSQL 6.1 中。
它有什么问题?: 这真的拖慢了性能,并占用大量的存储空间。但是这个概念很酷... 能够查询数据在另一个时间的样子。
要使用什么代替?: 您可以使用触发器来实现类似的机制。
版本 6.4
char2/char4/char8/char16 数据类型
它还能工作吗?: 不。这些在 PostgreSQL 6.4 中就被删除了。事实上我不应该提及这些,但你永远不会知道... 有人 *可能* 仍然在某个地方使用它们。
它有什么问题?: 不在 SQL 标准中,它们并不比使用普遍存在的 char(n) 快。
要使用什么代替?: char(n)
版本 7.0
abstime 数据类型
它还能工作吗?: 这在版本 11 之前仍然可以工作,但从 PostgreSQL 7.0 开始不再记录,只用于内部。尽管有它的名字,它支持日期和时间。它在版本 12 中被删除了。
它有什么问题?: 此数据类型提供的范围有限:’1901-12-14’ 到 ‘2038-01-19’。它也只有到秒级的分辨率。不幸的是,它的行为类似于 MySQL,如果你插入无效的值,它不会触发错误。相反,你只会看到 ‘invalid’ 作为值,当你查询它时。
要使用什么代替?: 由于 abstime 支持时区,更好的替代方案是使用带有时区的 timestamp (timestamptz)。它占用更多空间(8 字节而不是 4 字节),但它具有更广泛的范围:‘公元前 4713 年’ 到 ‘公元 294276 年’,并支持微秒级分辨率。
reltime 数据类型
它还能工作吗?: 这在版本 11 之前仍然可以工作,但再次强调,从 PostgreSQL 7.0 开始不再记录,仅供内部使用。它在版本 12 中也被删除了。
它有什么问题?: 它存储一个日期/时间偏移,但只有 +/- 68 年。再次强调,对于超过此限制的值,它不会报错。它会像 abstime 一样在列中放入 ‘invalid’ 吗?不会。相反,该值会环绕,因此输入 +70 年将导致大约 -66 年的值。这不是你想要的。它也只有到秒级的分辨率。
要使用什么代替?: 此类数据类型的 SQL 标准等效项是 interval,PostgreSQL 有这个数据类型。这确实占用了更多空间(12 字节),但它的范围非常大:‘-178000000 年’ 到 ‘+178000000 年’。它也具有微秒级分辨率。Interval 还可以处理相对时间单位;例如,将一个月添加到 2 月 15 日使用 interval 将得到 3 月 15 日,但是使用 abstime 它将一个月固定为 30 天,因此将得到 3 月 17 日(非闰年)。一年也被认为是 360 天。
timespan 数据类型
它还能工作吗?: 不。这在 PostgreSQL 7.0 中就被弃用,并在 PostgreSQL 7.3 中被完全删除。如果出于任何原因你正在使用它,那么你 *绝对* 需要升级,并且已经很多年了。
它有什么问题?: 它不在 SQL 标准中,实际上只是 interval 的别名。
要使用什么代替?: 只需使用 interval 即可。
psql/pg_dump 的 -u 选项
它还能工作吗?: 不,这在 PostgreSQL 7.0 中就被弃用,并在 8.3 中被删除。你绝对不应该使用它。
它有什么问题?: 此选项强制 psql 和 pg_dump 在连接到数据库之前提示输入用户名和密码。由于提示输入用户名始终是可选的,但提示输入密码可能是必需的也可能不是必需的(取决于身份验证方法),因此将这两个选项结合在一起没有意义。
要使用什么代替?: 它已被 -U 选项(用于指定用户名)和 -W 选项(用于提示输入密码)取代。
版本 7.1
getpgusername() 函数
它还能工作吗?: 可以,但从 PostgreSQL 7.1 开始它实际上被弃用了!
它有什么问题?: 它不再记录,并且可能在未来的版本中被删除,因为它已经过时。
要使用什么代替?: 调用 current_user,因为 getpgusername() 现在只是它的别名。
版本 8.1
autovacuum 扩展模块
它还能工作吗?: 不,因为它在 PostgreSQL 8.1 中被移入了核心。
它有什么问题?: 没有。恰恰相反。它被认为是如此重要,以至于它成为主代码库的一部分。
要使用什么代替?: 无需担心。由于它现在在核心代码中,您无需显式包含它,就可以直接使用。
版本 8.2
mSQL 接口和提示扩展模块
它还能工作吗?: 不,这些在 PostgreSQL 8.2 中被完全删除了。
它有什么问题?: 这些被认为是废弃的,并且没有维护。
要使用什么代替?: 没什么。
adddepend、dbase、dbmirror、fulltextindex、mac、ora2pg 和 userlock 扩展模块
它还能工作吗?: 不,同样,这些在 PostgreSQL 8.2 中被完全删除了。
它有什么问题?: 其中大多数被转移到 pgFoundry 以单独维护。
要使用什么代替?: 它们仍然存在于 pgFoundry 上,如果您真的需要它们(除了 fulltextindex 已经消失,ora2pg 在它自己的网站上),尽管它们现在都未维护(除了 ora2pg)。
版本 8.3
自动转换为文本
它还能工作吗?: 从 PostgreSQL 8.3 开始,非文本数据类型不再隐式转换为文本。这被认为是一些人从早期版本迁移的主要障碍之一,也是不兼容的最大原因。
它有什么问题?: 任何熟悉 PostgreSQL 的人都知道它不喜欢抛出任何奇怪或奇怪的行为。在某些情况下,隐式转换为文本会导致不希望的结果。例如:current_date < 2012-04-02 将导致两边自动转换为文本类型,即使右边的日期首先被认为是整数(2012 减去 4 减去 2)。
要使用什么代替?: 指定字面量时,始终明确数据类型是一个好习惯。这将避免任何不寻常的行为。
tsearch2 扩展模块
它还能工作吗?: 可以,但从 PostgreSQL 8.3 开始它被弃用了。
它有什么问题?: 它已被核心中的更改取代,并进行了一些功能更改。它仍然保留下来以实现向后兼容性。
要使用什么代替?: 使用更新的核心功能。文档中的 tsearch2 扩展模块页面上有关于如何转换为新功能的信息。
xml2 扩展模块
它还能工作吗?: 可以,但从 PostgreSQL 8.3 开始它被弃用了。
它有什么问题?: 实际上没有,并且它仍然保留下来以实现向后兼容性,但是核心代码中基于 SQL/XML 标准的新 XML 功能。
要使用什么代替?: 使用内置的 XML 功能(xml 数据类型、xml 函数、xml 参数)。
版本 8.4
pg_dump/pg_dumpall 的 -d 和 -D 选项
它还能工作吗?: 不,这些在 PostgreSQL 8.4 中被删除了。
它有什么问题?: 这些选项经常被误认为是数据库名称参数,但实际上它会导致数据库转储使用 insert 语句而不是 copy 语句输出。这在恢复时速度明显慢,并且不能事后调整。
要使用什么代替?: 如果有人真的想要有意使用这些选项,那么应该使用 --inserts 和 --column-inserts 的长名称选项。
版本 9.1
createlang/droplang 客户端应用程序
它还起作用吗?:仅限于 PostgreSQL 9.1 及之前的版本。
它有什么问题?:从 PostgreSQL 9.1 开始,语言被视为扩展。
应该用什么代替?:执行 CREATE EXTENSION <语言名称>。
CREATE/DROP LANGUAGE
它还起作用吗?:是的,但它不再用于用户,仅用于扩展。
它有什么问题?:从 PostgreSQL 9.1 开始,语言被视为扩展。
应该用什么代替?:您可以通过使用 CREATE EXTENSION <语言名称> 将其作为扩展安装来安装新语言。要删除它,请使用 DROP 等效项。如果您已将集群从先前版本升级到 9.1 或更高版本,则语言仍然会安装,但不是作为扩展。但是,您可以使用以下命令将其转换为扩展:CREATE EXTENSION <语言名称> FROM unpackaged。然后,您可以使用 DROP EXTENSION 将其删除。
9.2 版本
=> 运算符
它还起作用吗?:仅限于 PostgreSQL 9.1 及之前的版本,但从 PostgreSQL 9.2 开始,它不再起作用,至少对于 hstore 而言是这样。实际上,这在 9.0 中已被弃用,并且从那时起就发出有关使用它的警告。这在 hstore 扩展中尤其常用。您仍然可以创建此运算符,但这样做会返回警告。做好准备,在将来的版本中将完全禁止使用它。
它有什么问题?:“=>” 在 SQL 标准中保留用于命名函数参数,因此它需要可用于此类功能。
应该用什么代替?:如果您在 hstore 中使用过它,则需要将 text=>text 更改为 hstore(text,text)。如果您将其用作自定义运算符,则应将其更改为其他内容,因为它最终将被禁止。
文字语言名称大小写敏感性
它还起作用吗?:如果您使用的是 9.1 或更低版本,则可以,但从 9.2 开始,您将无法再使用它。
它有什么问题?:语言名称应该像标识符一样处理,而不是文字,而且一般而言,文字是区分大小写的。存在特殊代码对语言名称进行大小写折叠,因此字母大小写无关紧要,但此更改是完全移除语言名称作为字符串文字的第一步。
应该用什么代替?:在编写函数时,完全不要对语言名称使用单引号,而不仅仅是将它们小写。可以使用不带引号(因为它们对于任何核心语言都是不需要的),或者像使用任何其他标识符一样使用双引号。
配置参数
还有许多配置参数已被删除,它们是:
参数 | 在哪个版本中删除 | 原因 |
---|---|---|
australian_timezones | 8.2 | 更好的通用时区配置 |
preload_libraries | 8.2 | 已重命名为 shared_preload_libraries |
bgwriter_all_percent | 8.3 | 不再需要 |
bgwriter_all_maxpages | 8.3 | 不再需要 |
bgwriter_lru_percent | 8.3 | 不再需要 |
redirect_stderr | 8.3 | 已重命名为 logging_collector |
stats_block_level | 8.3 | 现在由 track_counts 涵盖 |
stats_command_string | 8.3 | 已重命名为 track_activities |
stats_reset_on_server_start | 8.3 | 可以使用 pg_stat_reset() 代替 |
stats_row_level | 8.3 | 现在由 track_counts 涵盖 |
stats_start_collector | 8.3 | 现在始终启用 |
explain_pretty_print | 8.4 | 不再需要 |
max_fsm_pages | 8.4 | 不再需要,因为每个关系的空闲空间映射处理此问题。 |
max_fsm_relations | 8.4 | 不再需要,因为每个关系的空闲空间映射处理此问题。 |
add_missing_from | 9.0 | 始终默认为“off”,因此现在永久关闭。 |
regex_flavor | 9.0 | 始终默认为“advanced”,因此现在永久设置为它。 |
custom_variable_classes | 9.2 | 认为最好将其删除,因为它只会导致更多维护,而好处很少。 |
silent_mode | 9.2 | 不再需要,因为可以使用 pg_ctl -l 或 NOHUP 来实现。 |
wal_sender_delay | 9.2 | 新的闩锁基础结构现在已使此设置变得多余。 |
replication_timeout | 9.3 | 已重命名为 wal_sender_timeout |
unix_socket_directory | 9.3 | 已重命名为 unix_socket_directories,现在接受以逗号分隔的目录列表 |