2013-06-05 45 views
0

對不起,這個標題很難解釋。mysql插入查找下一個序列

我有一個簡單的表是這樣的:

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列也就是說,客戶可以拖動並重新排列這些類別的client--通常設置,所以它不是auto_incremented。

我的問題是,當我想要在客戶端外使用直接插入SQL插入行時,是否有辦法在同一語句中快速獲取ordering列的最大值?

喜歡的東西:

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

我試圖在這個主題上沒有成功十幾個變化。

回答

2

的技巧來獲取工作是避免使用VALUES子句,而是使用SELECT作爲行來源的INSERT,

是這樣的:

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

注意:這可能適用於不允許併發插入的MyISAM表。但對於允許同時插入的其他引擎,這種方法很可能會「被設計中斷」。我不認爲有任何保證同時運行的兩個INSERT語句不會爲排序列生成相同的值。

當類別表爲空時,此設計也會「被設計中斷」,因爲MAX(排序)將返回NULL。但是IFNULL函數可以解決這個問題。

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

優秀!非常感謝。 – julio

+0

@ julio:注意我對此設計的警告...... – spencer7593

1

試試這個:

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