2011-12-17 71 views
0

我有一个表(foo),其中我已经在id一个PK:插入一个最大值(最大+ 1)

id  name  rank 
----------------------- 
1  AAAA  2 
2  BBBB  1 

我想插入新行,我知道id列的值和name,并且要求rank的值大于前面行中同一列中的任何其他值(类似于auto_increment对我们所做的)。

即,如果我要添加一行value = CCCC,那么rank列的值应为3。如果可能,我需要在复合语句中执行此操作。我尝试了以下不起作用。

insert into foo (`name`, `rank`) 
values ('CCCC', (select max(`rank`) from `foo`)) 

使我有以下错误:

You can't specify target table 'foo' for update in FROM clause 

注:我会非常喜欢有rank列作为auto_increment场,但显然这是不允许任何,因为我已经有PK。

PS:我需要能够在不使用存储过程的情况下从PHP执行此语句。

回答

2

试试这个第一,它被立即来源于你的信息:

INSERT INTO foo (`name`, `rank`) 
SELECT 'CCCC', (MAX(`rank`) + 1) AS rank 
FROM `foo` 

然后使用PDO,我认为这会工作:

如果
... 
$sql = "INSERT INTO foo (`name`, `rank`) SELECT ?, (MAX(`rank`) + 1) AS rank FROM `foo`" 
$name = "CCCC"; 
$st = $pd->prepare($sql); 
$st->bindValue(1, $name); 

try { 
    $retval = $st->execute(); 
} catch (PDOException $pdoex) { 
... 

不知道我在语法上是正确的,但这应该是关于它的要点...我认为

Err .. lemme知道如果SQL的作品,至少:D

+0

像一个魅力工程!第一个 – 2011-12-17 07:17:00