我有一组跟踪访问日志的表。日志包含有关用户访问的数据,包括用户代理字符串。由于我们知道用户代理字符串实际上是无限的,因此需要将它们存储为 text/blob 类型。鉴于高度重复,我想将它们存储在一个单独的参考表中,并让我的主访问日志表有一个链接到它的 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))
)
)
有什么方法可以不使用我刚刚编的名字的伪函数吗?我缺少的两部分是如何从上面获取选择以及如何从子查询插入中获取新 id。