2010-02-19 56 views
1

今天早些时候我问了这个问题,但我不确定我是多么清楚。将列更改为Auto_Increment

我有一个MySQL列填充有序号码1-56。这些数字是由我的PHP脚本生成的,而不是由auto_increment生成的。

我想要做的就是在PHP脚本设置正确的数字之后使此列auto_incrementing。 PHP脚本与jQuery接口协同工作,允许我使用jQuery的UI插件重新排列项目列表。

一旦我决定了我想要的条目的顺序,我希望列设置为自动增量,这样如果我插入一个新条目,它会识别已存在的最高数字在列中,并将其自己的ID号设置为比已有的ID高一个。

有没有人有任何建议如何处理这种情况?

+0

你想在数据库中自动增加吗? – 2010-02-19 01:16:08

+0

是的 - 我有另一个脚本,将简单地添加到数据库的内容,我想基本上识别哪个号码分配给条目的id列。也许让PHP脚本以某种方式检查现有的id数据的最高值并将传入数据的id分配给比存在的值高一个值会更聪明些? – 2010-02-19 01:22:32

回答

2

我建议你AUTO_INCREMENT已经就位创建表。你可以为auto_inc列指定一个值,并且mysql会使用它,而下一个插入为auto_inc列指定一个NULL或0值将会神奇地得到$ highest + 1赋值给它。

例如:

mysql> create table foobar (i int auto_increment primary key);

mysql> insert into foobar values (10),(25);

mysql> insert into foobar values (null);

mysql> select * from foobar;

# returns 10,25,26

+0

我的问题,这是一个事实,即使用jQuery UI如果我重新提交数据库条目进行排序的时候,我得到错误“key 1的重复条目0”...这是因为在尝试重新定义每个条目的id值时,它会运行提交前存在的条目的值。你能想到解决这个问题的方法吗? – 2010-02-19 01:48:16

0

您可以使用mysql控制台界面或使用phpmyadmin(最简单)通过php发出的查询来更改该查询。

ALTER TABLE table_name CHANGE old_column_name new_column_name column_definition; 
ALTER TABLE table_name AUTO_INCREMENT = highest_current_index + 1 

column_definiton:

old_column_definition AUTO_INCREMENT 

更多信息:

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

编辑 始终使用mysql_insert_id或抽象层的相关函数获取最后创建的ID,因为LAST_INSERT_ID可能导致错误的结果。

0

您可以切换到MySQL的AUTO_INCREMENT实现,但它会采取3个查询做到这一点:

一)ALTER TABLE到AUTO_INCREMENT添加到字段中的问题

B)SELECT MAX(id) + 1找出你需要把ID设为

C)ALTER TABLE table AUTO_INCREMENT =result from (b)

的MySQL认为改变AUTO_INCREMENT值表级的动作,所以你不能做到这一点(一),并且它不允许你在(c)中做MAX(id),所以3个查询。

+0

对于如何使用php的mysql_query()来显示语法,你有什么建议吗? – 2010-02-19 01:44:57

0

在MySQL中,您可以为auto_increment字段设置自定义值。然后,MySQL将为新行使用最高的auto_increment列值,实质上为MAX(id)+1。这意味着您可以有效地保留一系列ID以供自定义使用。例如:

CREATE TABLE mytable (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
col1 VARCHAR(256) 
); 
ALTER TABLE mytable AUTO_INCREMENT = 5001; 

在此架构中,所有ID为<的5001都保留供系统使用。所以,你的PHP脚本可以自动生成值:

INSERT INTO mytable SET id = NULL, col1 = 'whatevers2'; 
-- The id of the new row will be 5001 

预留了一系列这样的:

for ($i=1; $i<=56; $i++) 
mysql_query("INSERT INTO mytable SET id = $i, col1= 'whatevers'"); 

新作品将不指定ID或将其设置为null,则使用非保留范围键 - 以防将来需要超过56个特殊/系统行。

+0

有趣的解决方案,我可以考虑这样的事情....虽然这将是很好,没有限制 – 2010-02-19 01:50:56

1

不,停下来。这不是auto_increment的要点。如果你不打算让它们按ID排序,那么不要让它们成为auto_increment,只需在表格末尾添加一列以便订购,并享受它带给你的增加的灵活性。看起来你试图将两组不同的信息打包成一列,尽管这个主题中的所有善意的人都告诉你如何着手打击自己,但它真的只会咬你一口。

+0

我将让他们通过ID排序....我只是想,要通过我的PHP脚本进行初始定制的ID号码,然后,如果我插入一个条目,MySQL的弥补了就离开编号PHP脚本 – 2010-02-19 02:25:23