由于我不想深入的原因,我对表有一个"self-a patching"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
);
这个想法是,它填充数据库,并总是尝试使用最低的可用id(即,随着时间的推移,假设row file_id=3
被删除:它将立即在file_id=3
插入下一行--引用完整性不相关是有原因的)
现在它工作得很好,只是如果thefile
有零行,或者thefile count(*)
=零,它就不能在thefile
表上工作
处理开销对我来说非常重要:如果count=0
file_id
为1的最低处理开销是多少。。。它工作得很好,只是如果文件有零行,或者
thefile
计数(*)=零,它就不能在文件表上工作
更改:
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),
在这里使用聚结似乎很合适。
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。