0

对不起,这个很难在标题中解释。

我有一个像这样的简单表:

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列通常在客户端中设置——即客户端可以对这些类别进行拖动和重新排序,因此它不是 auto_incremented。

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

就像是:

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

我已经在这个主题上尝试了十几种变体,但都没有成功。

4

2 回答 2

2

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

像这样的东西:

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

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

当类别表为空时,这种设计也“被设计破坏”,因为 MAX(ordering) 将返回 NULL。但是一个 IFNULL 函数可以解决这个问题。

SELECT 'test title', 'description', IFNULL(MAX(ordering),0)+1 FROM `categories`
于 2013-06-05T23:07:29.143 回答
1

尝试这个:

insert into `categories` (`title`, `desc`, `ordering`) 
select 'test title','description', max(ordering) + 1 FROM `categories`
于 2013-06-05T23:07:15.297 回答