アクセスログを追跡する一連のテーブルがあります。ログには、ユーザーエージェント文字列を含むユーザーのアクセスに関するデータが含まれます。ユーザーエージェントの文字列は、すべての目的と目的で実質的に無制限であることがわかっているため、これらはテキスト/ブロブタイプとして保存する必要があります。重複度が高いため、これらを別の参照テーブルに保存し、メインのアクセスログテーブルにIDをリンクさせたいと思います。このようなもの:
accesslogs table:
username|accesstime|ipaddr|useragentid
useragents table:
id|crc32|md5|useragent
(the hashes are for indexing and quicker searching)
ここに問題があります。私は、外部キーのような派手なものを作成するためのアクセスを許可しないフレームワーク内で作業しています。さらに、これは複数のDBMS間で移植可能である必要があります。SELECTSを実行するために結合ロジックを作成しましたが、正しく挿入する方法を理解するのに問題があります。こんなことしたい
INSERT INTO accesslogs (username, accesstime, ipaddr, useragentid)
VALUES
(
:username,
:accesstime,
:ipaddr,
(
CASE WHEN
(
SELECT id
FROM useragents
WHERE
useragents.crc32 = :useragentcrc32
AND
useragents.md5 = :useragentmd5
AND useragents.useragent LIKE :useragent
) IS NOT NULL
THEN
THAT_SAME_SELECT_FROM_ABOVE()
ELSE
GET_INSERT_ID_FROM(INSERT INTO useragents (crc32, md5, useragent) VALUES (:useragentcrc32, :useragentmd5, :useragent))
)
)
名前を作成したばかりの疑似関数を使用しない方法はありますか?私が見逃している2つの部分は、上記からselectを取得する方法と、サブクエリ挿入から新しいIDを取得する方法です。