1

我需要执行这个查询:

SELECT MAX(col1) FROM table1;
INSERT INTO table1 (col1) VALUES (@someting);

@something 在哪里MAX(col1) + 1。你能帮我写查询吗?我需要查询也适用于 NULL 值......我想我需要一个 CAST。

这是一个类似drupal的表。col0 是 AUTO_INCREMENT,但 col1 不能有很多原因。

col0 是主键并且 auto_increment 处于活动状态。但我使用 vid 作为版本控制 ID。我需要在不插入新记录的情况下增加它,并且我需要一个线程安全的查询。

4

1 回答 1

6

为此,您不需要变量。您可以只使用一个INSERT INTO ... SELECT 语句:

INSERT INTO table1 (col1)
  SELECT MAX(col1) + 1 FROM table1

如果您需要通过返回 1 if MAX(col1)is来工作NULL,请使用COALESCE()

INSERT INTO table1 (col1)
  SELECT COLAESCE(MAX(col1) + 1, 1) FROM table1

注意:如评论中所述,如果您尝试创建递增列,请不要这样做。使用适当的AUTO_INCREMENT代替,这​​将不受竞争条件的影响。

评论后更新:

您在评论中的内容与您的问题有很大不同。您的语法无效,不应包含VALUES()关键字和括号组。相反,这样做:

INSERT INTO node (vid, type, uid, title, created, changed, status, promote, sticky)
  SELECT
    COALESCE(MAX(vid) + 1, 1),
    'node',
    1,
    'title', 
    1,1,1,1,1
  FROM node

假设它是主键,则正确的自动递增列定义vid如下所示:

vid INT NOT NULL PRIMARY KEY AUTO_INCREMENT

使用上述,就没有必要做MAX(vid) + 1

于 2012-05-15T18:15:52.000 回答