0

CodeIgniter2.1.3とPHP5.4.8、および2つの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 BYです。

明確に定義され、列に格納されている列の順序は完全に正しくありません。列定義リストや。など、さまざまな場所で使用されています。これは、ダンプ/復元サイクルを通じて保持され、ストレージのサイズとパフォーマンスに大きく影響しますpg_attribute.attnumINSERTSELECT *

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 に答える