2012-09-03

ある特定の文字列を一気に置換させたいときのSQLです。
処理時間は結構かかってしまう気がしますが。

update テーブル名 set 列名=replace(列名,’変換前文字列’,’返還後文字列’) where 列名=’条件’;

2010-08-03

サーバーの移行作業で、PostgreSQLのデータをphpPgAdminでインポート、エクスポートしたときに、
文字コードがらみと改行の問題で、データをそのままインポートできませんでした。

そこでまずSSHでログインし、psqlのcopyコマンドでデータをエクスポートし、
そのデータをエクセルでダブルクォーテーションでくくることにしました。

aaa,bbb,ccc
 ↓
“aaa”, “bbb”, “ccc”

やり方は、別シートか別のセルで 「=””””&A1&””””」とすると、A1のセルのデータが
ダブルクォーテーションでくくられます。
さらにこれをCSV保存して、エディタで見ると、ダブルクォーテーションが3つある状態なので、
一括置換で3つを1つに変換しました。

なんかもっといいやり方があるんじゃないかなーとも思うのですが、
今回はこれで解決できたので、とりあえずはよしとしたいと思います。


※後日、PostgreSQLのデータ移行については、SSHでインポートすることで、あっさり解決しました!

2010-06-24

phpPgAdminを使ってテーブルの作成をすると、どういうわけか作成する時点で
プライマリーキーやユニークキーを設定することができません。

そしてプライマリーキーを設定していないと、phpPgAdminでは編集することができません。
(たぶんPostgreSQLにバージョンによると思います。)

そこで一度テーブルを作ってから、そのテーブルを選び、「検査制約一覧」をクリックします。
すると「検索制約がありません」と表示され、その下に追加のメニューが出てくるので、
「プライマリーキーの追加」などを選んで、次の画面でどの項目を設定するか決めれば
作成することができます。

2010-04-23

仕事で安価なVPSもしくは専用サーバーを探していたのですが、
MySQLはインストールされて使えるものの、PostgreSQLは対応していないという
サーバーが結構あるようでした。

MTもバージョン5からはMySQLのみの対応になってしまいましたし、
そのあたりの影響もあるのでしょうか。

個人的に作っていたサイトではMySQLを使用していたこともあるので、
技術的に困ることはないと思うのですが、
昔から仕事ではPostgreSQLを使用していたことが多く、
MySQLだけになってしまうのは少しさみしい気分です。

2010-02-05

ショッピングシステムの在庫管理をするにあたり、
現在のシステムでは現在の在庫数だけで、在庫増減の履歴データがなかったので、
ルールを作成することで、ログをおとすことにしました。

最初はトリガを作る予定だったのですが、ルールの方が簡単っぽかったので、
今回はルールを採用しました。

create rule zaiko_insert_rule as on insert to zaiko do
insert into zaiko_log values(new.goods_id,new.color_text,new.size_text,new.zaiko,new.zaiko,"timestamp"('now'::text));

create rule zaiko_update_rule as on update to zaiko do
insert into zaiko_log values(new.goods_id,new.color_text,new.size_text,new.zaiko,old.zaiko,"timestamp"('now'::text));


zaikoテーブルに追加・更新があった場合に、新たに作成したzaiko_logというテーブルに、
データを追加していきます。

ちょっとよくわからなかったのが、insertとupdateを同時に1つのルールにできなかったこと。
トリガの場合はできると思うのですが、そこは今回調べ切れませんでした。

また、日時を取得するのに単純にnowを入れると、同じ日時が入ってしまう現象があったので、
“timestamp”(‘now’::text)と書くことで解決できました。

2010-01-06

共通のキーを持った2つのテーブルで、片方にしかレコードがないデータの抽出方法です。

select a.column from table_a a where not exists (select b.column from table_b b where a.id = b.id)

2009-11-20

PostgreSQLのSELECT文にて指定した行数(何件目から何件目)のデータを取得するやり方です。

・検索結果の1件目(オフセット=0)から、3件分のデータを取得する場合
SELECT * FROM table LIMIT 3 OFFSET 0;

・検索結果の10件目(オフセット=9)から、5件分のデータを取得する場合
SELECT * FROM table LIMIT 5 OFFSET 9;


ちなみにMySQLではそれぞれこう記述するようです。
SELECT * FROM table LIMIT 0, 3;
SELECT * FROM table LIMIT 9, 5;

2009-11-12

過去にもちょっと調べたもののうまくいっていなかった、
同一テーブルでのレコードのコピーのやり方がわかったのでメモしておきます。
(PHPで使用する場合の例)

条件で抽出したデータと同じ内容を入れたいカラムには、単純にカラム名を書けばOK。
別の値(新しいID、登録日付など)を入れたい場合には、それを該当カラムに入力します。

INSERT INTO table_name (column1,column2,column3,column4,column5) SELECT ".$new_id.",column2,column3,'33',','2999-12-31' FROM table_name A WHERE A.column1=".$id

2009-10-29

PostgreSQLのデータベースがEUCで、PHPはUTF-8の場合、
pg_set_client_encoding($con, UNICODE);
でOK。

2007-11-08

普通にORDER BYを使うと、大文字が先で小文字が後になってしまいます。
そこで、ORDER BY UPPER(列名) としてすべて大文字変換で
ソートさせるとOK。