0

我正在使用 CodeIgniter 2.1.3 和 PHP 5.4.8,以及两个 PostgreSQL 服务器(P1 和 P2)。

list_fields()在 CodeIgniter 中遇到了函数问题。当我从 P1 服务器检索字段时,字段按照我最初创建表的顺序排列。但是,如果我使用完全相同的代码从 P2 服务器检索字段,则字段顺序相反。

如果 P1 的字段是array('id', 'name', 'age'),

P2 的字段变为array('age', 'name', 'id')

我不认为这是 CodeIgniter 特定的问题,而是一般的数据库配置或 PHP 问题,因为代码是相同的。

这是我获取字段的代码。

$fields = $this->db->list_fields("clients");
4

2 回答 2

2

我必须澄清一些事情。@muistooshort 在上面的评论中声称

从技术上讲,表中的列没有定义的顺序。

@mu 可能正在考虑order 或 rows,没有ORDER BY.

列的顺序是完全不正确的,它在列中定义并存储pg_attribute.attnum。它用于许多地方,例如INSERT没有列定义列表或SELECT *. 它通过转储/恢复周期进行保存,并且对存储大小和性能有重要影响

您不能简单地更改 PostgreSQL 中列的顺序,因为它还没有实现。它与系统紧密相连,很难改变。有一个Postgres Wiki 页面,它位于项目的 TODO 列表中

通过记录每列的显示、存储和永久 id 来允许列显示重新排序?

找出你的桌子:

SELECT attname, attnum
FROM   pg_attribute 
WHERE  attrelid = 'myschema.mytable'::regclass
AND    NOT attisdropped  -- no dropped (dead) columns
AND    attnum > 0        -- no system columns
ORDER  BY attnum;

SELECT *某些情况下使用是不明智的,因为基础表的列可能会更改并破坏您的代码。在需要所有列(默认顺序)的其他上下文中使用是明确明智的。SELECT *

至于首要问题

这不应该发生。SELECT *在 PostgreSQL 中以明确定义的顺序返回列。有些中间件一定在惹你生气。

于 2013-03-15T03:14:54.337 回答
0

我怀疑您已经习惯了 MySQL,它允许您在创建表后重新排序列。PostgreSQL 不允许你这样做,所以当你:

ALTER TABLE foo ADD bar int;

它总是把它放在桌子的最后,没有办法改变顺序。

在 PostgreSQL 上,您不应该假设列的顺序是有意义的,因为根据列的定义顺序,这些顺序可能因服务器而异。

然而,这些颠倒的事实对我来说很奇怪。

如果您想在 db 上查看预期顺序,请使用:

\d foo 

来自 psql

如果这些都颠倒了,那么问题就出在数据库创建中(这是我的第一印象)。这是首先要看的。如果这没有显示问题,那么 CodeIgniter 确实有一些奇怪的事情发生。

于 2013-03-14T13:50:51.697 回答