【问题标题】:Rename INDEX Column重命名索引列
【发布时间】:2010-05-27 19:50:03
【问题描述】:

我有一个包含大约 40 个表的数据库,需要重命名每个索引列。

IE USER 一张表有一堆字段,比如

user_id | user_username | user_password | etc...

我想将 ID 列重命名为 id ie

id | user_username | user_password | etc...

但我在 alter table 命令上不断收到 mysql 错误,即。

ALTER TABLE 数据库 RENAME COLUMN user_id 为 id;

还有许多不同的变体。

最好的方法是什么?

希望大家多多指教

【问题讨论】:

  • 你得到的错误信息是什么?

标签: mysql primary-key auto-increment


【解决方案1】:

您必须删除所有外键约束,更改主键,然后再次添加约束。

顺便说一句,更改主键是一件非常严肃的事情,只有当你真的非常需要时才应该这样做。此更改将破坏使用您的数据库的每个应用程序。

【讨论】:

    【解决方案2】:

    如果我是你,我不会那样做。在这样做之前,我会弄清楚如何在你正在做的任何事情中改变你需要做的任何事情。除非您是数据库结构的工程师或使用它的软件的工程师,否则永远不会建议或推荐这样做。这样做就像把糖、水、可乐和沙子放在一个油箱里,然后说:“哎呀,会出什么问题?”

    即使上面那个人所说的关于放弃约束并将它们全部放回原处。对于数据库工程/结构来说,这一切都很好,但即使这样做了,使用它们的应用程序也有自己的问题。对数据库列名进行搜索替换也不起作用。尤其是你有时看到的命令结构,你只会把代码搞砸。

    【讨论】:

      【解决方案3】:

      对于每个表,您应该可以使用如下代码执行此操作(注意:我假设每个*_id 字段的列描述为INTEGER NOT NULL,并且这些相同的字段设置了AUTO_INCREMENT。这对于 ID 列来说是很正常的。)

      # remove auto_increment, allows us to remove primary key
      ALTER TABLE user MODIFY user_id INTEGER NOT NULL;
      
      # remove primary key, allows us to change column name
      ALTER TABLE user DROP PRIMARY KEY;
      
      # change column name, re-add auto_increment and primary key
      ALTER TABLE user CHANGE user_id id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY;
      

      不过,请注意其他人的警告。除非这是您创建的(并且您刚刚决定在项目早期更改命名约定或其他内容),否则更改此设置将破坏任何其他预期与此数据库交互的代码。

      希望这会有所帮助,

      安东尼

      编辑:以上假设您没有外键约束,其他表显式引用 user.user_id 列。如果不是这种情况,您必须在更改名称之前删除所有外键约束,然后重新添加它们。如果您不确定数据库中的哪些位置存在外键关系,可以使用以下代码将它们全部列出(从http://www.xinotes.org/notes/note/477/ 复制以提高答案的复制/粘贴能力):

      SELECT CONCAT(table_name, '.', column_name, ' -> ', referenced_table_name, '.', referenced_column_name)
      FROM information_schema.key_column_usage
      WHERE referenced_table_schema = schema()
      AND referenced_table_name is not null
      ORDER BY table_name, column_name;
      

      【讨论】:

        猜你喜欢
        • 2017-08-03
        • 2018-08-02
        • 2022-11-21
        • 2016-11-12
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        相关资源
        最近更新 更多