mysql insert按顺序查找下一个

时间:2013-06-05 23:00:04

标签: mysql sql

很抱歉,这个很难在标题中解释。

我有一个这样的简单表:

CREATE TABLE `categories` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(125) NOT NULL,
  `desc` text NOT NULL,
  `ordering` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
)

ordering列通常在客户端中设置 - 也就是说,客户端可以拖动和重新排序这些类别,因此不会自动增加。

我的问题是,当我想使用直接SQL插入在客户端外插入一行时,是否可以在同一语句中快速获取ordering列的最大值?

类似的东西:

INSERT INTO `categories` (title, desc, ordering)
VALUES ('test title', 'description', (SELECT max(ordering) FROM `categories`)+1);

我在这个主题上尝试了十几种变体而没有成功。

2 个答案:

答案 0 :(得分:2)

让它工作的诀窍是避免使用VALUES子句,而是使用SELECT作为INSERT的行源,

类似的东西:

INSERT INTO `categories` (title, desc, ordering)
SELECT 'test title', 'description', MAX(ordering)+1 FROM `categories`

注意:这可能适用于不允许并发插入的MyISAM表。但对于允许并发INSERTS的其他引擎,这种方法可能会“被设计破坏”。我不认为有任何保证并发运行的两个INSERT语句不会为排序列生成相同的值。

当类别表为空时,此设计也“按设计破坏”,因为MAX(排序)将返回NULL。但IFNULL功能可以解决这个问题。

SELECT 'test title', 'description', IFNULL(MAX(ordering),0)+1 FROM `categories`

答案 1 :(得分:1)

试试这个:

insert into `categories` (`title`, `desc`, `ordering`) 
select 'test title','description', max(ordering) + 1 FROM `categories`