从两个不同的服务器检索时,PHP中的不同PostgreSQL字段顺序

时间:2013-03-13 17:40:31

标签: php codeigniter postgresql

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

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

如果来自P1的字段为array('id', 'name', 'age')

来自P2的

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

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

这是我获取字段的代码。

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

2 个答案:

答案 0 :(得分:2)

我必须澄清一些事情。 @muistooshort claims in a comment above

  

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

@mu可能会想到顺序或行,这是ORDER BY时的任意。

完全不正确,定义良好并存储在pg_attribute.attnum列中。它在许多地方使用,例如INSERT没有列定义列表或SELECT *。它通过转储/恢复周期保留,并具有significant bearing on storage size and performance

你不能简单地改变PostgreSQL中列的顺序,因为它尚未实现。它与系统紧密相连,难以改变。有一个Postgres Wiki page,它位于TODO list of the project

  

通过记录显示,存储和,允许列显示重新排序   每列的永久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中以明确定义的顺序返回列。有些中间件必须弄乱你。

答案 1 :(得分:0)

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

ALTER TABLE foo ADD bar int;

它将此列在表格始终的末尾,并且无法更改订单。

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

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

如果要查看数据库上的预期顺序,请使用:

\d foo 

来自psql

如果这些是相反的,那么问题出在数据库创建中(这是我的第一印象)。这是首先要看的东西。如果这没有显示问题那么CodeIgniter就会发生一些奇怪的事情。