很抱歉,这个很难在标题中解释。
我有一个这样的简单表:
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);
我在这个主题上尝试了十几种变体而没有成功。
答案 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`