MySQLで最後に発行されたAUTO INCREMENTの値を変数に代入

2012-05-11
このエントリーをはてなブックマークに追加

MySQLにバッチファイルとかでデータ投入していく時、リレーションを張っている場合は子のテーブルには親テーブルのpkが必要になります。fkの値ですよね。

親テーブルにinsert、新たに発行されたpkの値を変数にいれて、そのまま続けて子テーブルにもinsertしていくサンプル。

久々に書こうとして「あれ?どうやって書いたっけ」って悩んでしまったのでメモしておこう。

insert into oya(body) values(‘hogehoge’);
SET @oya_id = (select last_insert_id() from oya);
insert into ko(oya_id, body) values(@oya_id, ‘ko-hogehoge’);

last_insert_id()ってMySQLだけかも。PostgreSQLとかは確か違う取得の仕方だったと。あ、もちろん各テーブルのpkになるidというカラムはAUTO INCREMENTです。

これを

mysql -u ユーザ名 DB名 < 上記クエリが書かれたファイルへのパス

って実行してやればOKかと。

ちなみにこんなテーブルです。

CREATE TABLE oya(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

CREATE TABLE ko(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
oya_id int(11) unsigned NOT NULL,
body varchar(255) NOT NULL DEFAULT ”,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8;

Tags: ,

Djangoで実行されたSQLを確認する方法

2011-12-13
このエントリーをはてなブックマークに追加

ORM使っててなんか結果がいまいちなときは、どんなSQLが実行されたのか確認したくなるのが人情ってもんだと。

で、その方法です。

from django.db import connection
print connection.queries

これだけです。Django1.3でしか試してませんが、きっともっと古いのでも動くと思います。

Tags: , ,

RubyonRailsでLike演算子を使ったあいまい検索をする方法

2009-07-07
このエントリーをはてなブックマークに追加

:conditionsにクエリ文字列ごりごり書くなら別に気にしなくてもいいのですが、まぁたいていはインジェクション対策も兼ねてプレースホルダーを使うか、シンボルを使うかのどちらかでは無いでしょうか。

ハセテツは前者です。PHPでもPEARを使っていたので、プレースホルダーを使っていました。

で、Rails(ActiveRecord)でプレースホルダーを利用している状況でLike演算子を使ったあいまい検索はどうしたらよいものか、と意外にシンプルな部分で躓いたりします。キーワード検索機能を実装しない限り、Like演算子って使わないですよね。

:conditions => [“hoge like ?”, “%#{hogeParam}%”]

上記の書き方であいまい検索ができました。手抜きではあるのですが、これでhogeParamが空白文字列であっても検索はできます。nilだったらどうしようもないですけどね。

MySQLで複数のテーブルを外部結合

2008-11-20
このエントリーをはてなブックマークに追加

ネストしてもいいのですが、可読性が悪かったりパフォーマンスが悪くなったり。

select * from table_0 i
left join table_1 j on i.id = j.id
left join table_2 k on i.id = k.id

つまり、「table_0に対してtable_1とtable_2を結合しまっせ。」ということです。ネストしてないのでとっても読みやすいです。パフォーマンスも、よい気がします(計測しろよというご指摘はごもっともです)。

Tags: ,

MySQLで先月末日の日付を取得する

2008-10-28
このエントリーをはてなブックマークに追加

select last_day(date_add(now(), interval -1 month))

まぁなんてことない手法なのですが、なんとなく便利だったので記録。「今日の一ヶ月前の月の末日」っていう意味ですね。

Tags: ,

MySQLで前月、来月、三日前等の日付を求める

2008-05-05
このエントリーをはてなブックマークに追加

select adddate(now(), interval- 3 month);

これで、3ヶ月前の日付が得られる。引数は前から
「基準日、差分、単位」
となっている。

year,day,hour等も利用可能。

MySQLでユーザを追加する

2008-05-05
このエントリーをはてなブックマークに追加

ずっとMS SQLSERVERかPostgreSQLをメインに使ってたんだけど、最近MySQLに触れることがどんどん増えてきました。まぁ覚えておいて損はないので備忘録に追加。

grant all on DB名.* to ‘ユーザ名’@’%’ identified by ‘パスワード’;

flush privileges;

allは全部できまっせ、という意味。DB名のあとのアスタリスクはワイルドカード。すべてのテーブルに対して、という意味。ユーザ名のあとの「%」はどっからでも、という意味。これを「localhost」としておけば、localhostからの接続しか許可しないようになる。まぁMySQLよりも先にLinuxのFWがあるが。

「flush privileges;」は設定情報を反映させるコマンド。ついついコレを忘れてしまう。

Tags: ,

SQL内でCASEを記述する、条件分岐する

2008-01-05
このエントリーをはてなブックマークに追加

select
case
when hoge = 1 then ‘1でした’
when hoge = 2 then ‘2でした’
end as hogecase from hogetable

わかりにくい例ですが、case~endがまぁcaseブロック、when以降が条件、then以降が結果ですね。コレをしらないと、ロジック側でループさせながらぐりぐり判定させないといけないのですが、知っていることによって大幅にロジックを減らせます。

SQLServerやPostgreSQL限定ではなく、SQL-92に載っている手法なので、他のDBでも利用可能です。知っておくべき、活用すべきでしょう。

Tags: