【问题标题】:Change Column to Auto_Increment将列更改为 Auto_Increment
【发布时间】:2011-01-18 14:29:48
【问题描述】:

我今天早些时候问过这个问题,但我不确定我说得有多清楚。

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

我想做的是在 PHP 脚本设置正确的数字后使该列自动递增。 PHP 脚本与 jQuery 界面协同工作,允许我使用 jQuery 的 UI 插件重新排序项目列表。

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

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

【问题讨论】:

  • 你想在数据库中自动递增吗?
  • 是的 - 我有另一个脚本,它将简单地将内容添加到数据库中,我想基本上识别为条目分配给 id 列的数字。也许让 PHP 脚本以某种方式检查现有 id 数据的最大值并将传入数据的 id 分配给比现有值高 1 的值会更聪明?

标签: php jquery sql mysql


【解决方案1】:

不,停止。这不是 auto_increment 的重点。如果您不打算让它们按 id 排序,那么不要让它们成为 auto_increment,只需在表的末尾添加一列进行排序,并享受它为您提供的额外灵活性。似乎您正试图将两组不同的信息打包到一个列中,尽管此线程中所有善意的人都在告诉您如何开始射击自己,但实际上只会让您感到痛苦。

【讨论】:

  • 我要让它们按 id 排序....脚本以编号结束
【解决方案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

【讨论】:

  • 我遇到的问题是,当使用 jQuery UI 对数据库条目进行排序时,如果我重新提交,我会收到错误“键 1 的重复条目 0”......这是因为在尝试重新定义每个条目的 id 值时,它会遇到提交之前存在的条目的值。你能想出办法解决这个问题吗?
【解决方案3】:

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

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

列定义:

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 可能会导致错误的结果。

【讨论】:

    【解决方案4】:
    ALTER TABLE <table name> <column name> NOT NULL AUTO_INCREMENT
    

    更多信息: AUTO_INCREMENT Handling in InnoDB

    Server SQL Modes

    【讨论】:

      【解决方案5】:

      在 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

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

      新条目将通过不指定 id 或将其设置为 null 来使用非保留范围:

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

      保留这样的范围是关键 - 以防您将来需要超过 56 个特殊/系统行。

      【讨论】:

      • 有趣的解决方案,我可能会考虑这样的事情......虽然没有限制会很好
      【解决方案6】:

      您可以将其切换到 MySQL 的 auto_increment 实现,但需要 3 个查询才能完成:

      a) ALTER TABLE 将 auto_increment 添加到相关字段

      b) SELECT MAX(id) + 1 了解您需要将 ID 设置为什么

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

      MySQL 认为更改 AUTO_INCREMENT 值是一个表级操作,因此您不能在 (a) 中执行此操作,并且不允许您在 (c) 中执行 MAX(id),因此需要 3 个查询。

      【讨论】:

      • 您对使用 php 的 mysql_query() 的语法可能如何显示有任何建议吗?
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2011-02-11
      • 2014-04-17
      • 2021-12-04
      • 1970-01-01
      • 2016-06-22
      相关资源
      最近更新 更多