2010年8月30日月曜日

SQLiteでは、カラムを削除するコマンドが無い様子。

SQLiteでカラムを削除しようと思って調べたら、alter table などではできないらしい。

http://www.sqlite.org/faq.html

どうしても無くしたければ、新しいテーブルを作って、そちらにトランザクションなりで必要な部分だけをエクスポートして下さいな、ということですね。
そうなんですね。

以下、本家FAQからの引用。

型指定がないので、移行はかなり簡単そうではありますね。。
(11) How do I add or delete columns from an existing table in SQLite.

    SQLite has limited ALTER TABLE support that you can use to add a column to the end of a table or to change the name of a table. If you want to make more complex changes in the structure of a table, you will have to recreate the table. You can save existing data to a temporary table, drop the old table, create the new table, then copy the data back in from the temporary table.

    For example, suppose you have a table named "t1" with columns names "a", "b", and "c" and that you want to delete column "c" from this table. The following steps illustrate how this could be done:

        BEGIN TRANSACTION;
        CREATE TEMPORARY TABLE t1_backup(a,b);
        INSERT INTO t1_backup SELECT a,b FROM t1;
        DROP TABLE t1;
        CREATE TABLE t1(a,b);
        INSERT INTO t1 SELECT a,b FROM t1_backup;
        DROP TABLE t1_backup;
        COMMIT;

2010年8月28日土曜日

insert文には()が必要なんですね。

sprintf("insert into tbl (columnA,columnB) values ('%s','%s')",$a,$b);
のように、insert文を発行するとき、
valuesの後に括弧()をつけていなかったら挿入されず、しばし悩みました。

で、括弧()をつけたらすぐ解決。
良かった。

auto incrementの値をリセット

ALTER TABLE <テーブル名> AUTO_INCREMENT = 5;
のようにすれば、
連番を5から始められる。

間違って挿入したレコードを消去し、改めて挿入し直すときに、大量のデータを流し込んだものを削除した後だと連番にものすごく開きができるので、ALTER TALBEでリセットできるのはありがたい。

MySQLで。

insert intoで挿入されなくて悩んだ(文字コードの問題だった)

insert intoをsql文で書いても、
英字は挿入されるが、日本語がされなかった。
ローカル環境ではOKなのに、本番環境ではダメ。

日本語が通らないので、文字コードの絡みかな、とひらめいてチェックしたら、
ファイルの保存文字コードがSJISになっていた。。
UTF8に直して保存し直したら、ぶじOKでした。

未だに文字コードの保存ミス、やっちゃうな。残念!

2010年8月24日火曜日

explodeはそのまま配列を作る。

今日は、「explodeはそのまま配列を生成してくれる」と学習しました。

例えば、
$test="hoge,huga,foo,baa";
$ary=array();
$ary=explode(",",$test);
print_r($ary);
のような場合、

$ary[]=explode(",",$test);
のようにせず、
$ary=explode(",",$test);
と書けばOKだった。

さもないと、
$ary[0]の中に二次元配列が生成されてしまう様子。

2010年8月5日木曜日

datetime型のsortで10時前の時間がうまくソートされず、悩みました。

MySQLでdatetime型のソートをするとき、
9:00
11:30
17:00
と並べたいのに、

11:30
17:00
9:00
と並んでしまい、困っていました。

原因は、
order byで
date_format(start_time,'%k:%i') as start_time
といったように、フィールド名と同名で、24時間表記の10時前の時間から最初の0(ゼロ)を抜いていたことで、
order by start_time
としていたことが原因でした。

09:00が
9:00
となっていたことで、1より9が後、と判断していたのですね。

初歩的なミスでした。