我正在使用CodeIgniter 2.1.3和PHP 5.4.8,以及两个PostgreSQL服务器(P1和P2)。
我在CodeIgniter中遇到list_fields()
函数问题。当我从P1服务器检索字段时,字段按我最初创建表的顺序排列。但是,如果我使用完全相同的代码从P2服务器检索字段,则字段的顺序相反。
如果来自P1的字段为array('id', 'name', 'age')
,
字段变为array('age', 'name', 'id')
我不认为这是CodeIgniter的具体问题,而是一般的数据库配置或PHP问题,因为代码是相同的。
这是我获取字段的代码。
$fields = $this->db->list_fields("clients");
答案 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就会发生一些奇怪的事情。