自我修补MySQL中的主键,我可以这样做,但我怎么做id = 1

时间:2014-04-11 16:33:43

标签: mysql primary-key subquery

由于我不愿意进入的原因,我对表有一个“自我修补”的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,那么处理开销最低的是什么?

2 个答案:

答案 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。