由于我不愿意进入的原因,我对表有一个“自我修补”的pkey id要求。我的意思是新的插入ID必须始终是最低的id,并且故意留下没有auto_increment
的表
这是我到目前为止所拥有的
INSERT INTO thefile (
file_id,
fullpathname,
filesize
) VALUES (
(SELECT MIN(t1.file_id+1) FROM thefile t1 LEFT JOIN thefile t2 ON t1.file_id + 1 = t2.file_id WHERE t2.file_id IS NULL),
'/some/path/file',
24576
);
这个想法是它填满了db并且总是尝试使用最低的可用id(即随着时间的推移,让我们说row file_id=3
被删除:它将立即插入file_id=3
的下一行 - - 有理由说明参考完整性不相关)
现在它的工作非常出色,只是如果thefile
的行数为零,或thefile
= 0
thefile count(*)
表上运行
处理开销对我来说非常重要:如果file_id
count=0
为1,那么处理开销最低的是什么?
答案 0 :(得分:1)
...它的工作非常出色,但如果文件的行数为零,或者
,则它不会对文件表起作用thefile
计数(*)= 0
更改:
SELECT MIN(t1.file_id+1)
FROM thefile t1
LEFT JOIN thefile t2
ON t1.file_id + 1 = t2.file_id
WHERE t2.file_id IS NULL),
致:
SELECT coalesce( MIN( t1.file_id ), 0 ) + 1
FROM thefile t1
LEFT JOIN thefile t2
ON t1.file_id + 1 = t2.file_id
WHERE t2.file_id IS NULL),
答案 1 :(得分:0)
在这里使用coalesce似乎是合适的。
MIN(coalesce(t1.file_id,0)+1)
或完整:
INSERT INTO thefile (
file_id,
fullpathname,
filesize
) VALUES (
(SELECT MIN(coalesce(t1.file_id,0)+1)
FROM thefile t1
LEFT JOIN thefile t2
ON coalesce(t1.file_id,0) + 1 = t2.file_id
WHERE t2.file_id IS NULL),
'/some/path/file',
24576
);
这假设您也不会从0开始...否则合并将需要为-1。