2012-01-01 86 views
4

没有与一个int字段的表 - field_1。
我想插入一个新行。
field_1的值将是所有条目的最大值加1。
我已经试过:自动递增手动

INSERT INTO table (field names, `field_1`) 
VALUES (values, '(SELECT MAX(field_1) FROM table)'); 

我得到的field_1 '0'。
我知道我可以在单独的查询中做到这一点。 有没有办法用一个查询来执行这个动作?我的意思是来自php的一个电话。

我有一个自动递增字段“身份证”,我要添加“位置”字段。我希望能够让位置的变化,但新的项目将始终具有最高位置

+3

为什么你要做到这一点时,MySQL的自动执行呢? – emaillenin 2012-01-01 14:40:20

+0

请解释你正在努力实现的目标,而不是要求我们帮助你实现你认为会做你正在努力实现的解决方案。 – 2012-01-01 14:46:13

+0

我已经有一个自动增量字段。所以当我尝试将field_1设置为自动增量时,我得到这个错误:不正确的表定义;可以只有一个自动列,它必须被定义为一个键 – lvil 2012-01-01 14:49:50

回答

5

不管它是什么,你正在尝试做的,它不会工作,因为它不能保证是原子。因此,并行执行的这个查询的两个实例保证在某个随机时间点彼此混淆,导致跳过的数字和重复的数字。

之所以数据库提供自动递增正是以解决这一问题,在这些增加值的生成保证原子。

(最后,“自动递增手动”是一个矛盾,它要么将是“自动递增”,否则将是“手动增量”。只是作为一个聪明的驴子在这里。)

编辑(后OP的编辑)来解决您的问题将是留下Position场零或NULL,然后执行UPDATE table SET Position = Id WHERE Position IS NULL

一个低效的方法。 (假设Id是表中的自动编号字段。)

一个有效的,但麻烦的办法是离开Position场空当您没有修改它,并给它一个价值只有当你决定对其进行修改。然后,你想读的Position领域的每一次,使用CASE声明:如果Position字段为空,然后使用Id值;否则,使用值Position

EDIT2

如果你只有30行,我不明白为什么你甚至试图保持正确的顺序在数据库中(考虑到OP在评论解释后)。只加载所有行的数组,编程方式分配递增值被发现是空的任何Position领域,当你的阵列的变化行的顺序,刚修好的Position值,并更新数据库中的所有30行。

+0

我从昨天开始一直在想这个,我编辑了我的答案以添加一些新的见解。 – 2012-01-02 19:24:17

0

ALTER TABLE table_name AUTO_INCREMENT = 1 allows the database to reset the AUTO_INCREMENT to:

MAX(auto_increment_column)+1

It does not reset it to 1.

This prevents any duplication of AUTO_INCREMENT values. Also, since AUTO_INCREMENT values are either primary/unique, duplication would never happen anyway. The method to do this is available for a reason. It will not alter any database records; simply the internal counter so that it points to the max value available. As stated earlier by someone, don't try to outsmart the database... just let it handle it. It handles the resetting of AUTO_INCREMENT very well. See gotphp

+0

答案中的链接似乎已过时。 – Pang 2016-11-24 09:21:46

0

试试这个:

INSERT INTO table (some_random_field, field_to_increment) 
SELECT 'some_random_value', IF(MAX(field_to_increment) IS NULL, 1, MAX(field_to_increment) + 1) 
FROM table; 

或者这样:

INSERT `table` 
SET 
    some_random_field = 'some_random_value', 
    field_to_increment = (SELECT IF(MAX(field_to_increment) IS NULL, 1, MAX(field_to_increment) + 1) FROM table t); 

附:我知道这是迟了4年,但我正在寻找相同的答案。 :)