如果它是主键并且被索引,如何更改列的数据类型?

Posted

技术标签:

【中文标题】如果它是主键并且被索引,如何更改列的数据类型?【英文标题】:How to change the data type of a column if it is the primary key and is indexed? 【发布时间】:2021-06-02 12:57:24 【问题描述】:

我正在使用 IBExpert 来操作我的数据库。我有一个包含两个字段的旧表:

 - code (char 3)  PK + INDEX
 - name (varchar 30)

新表应该是

 - code (integer) PK + INDEX
 - name (varchar 30)

code列的数据即使是char类型也只包含数字。

是否可以更改代码列的类型?如果是怎么办?我假设我需要删除主键并删除或停用索引,但是当我尝试删除 PK 时,IBExpert 不会让我这样做并给我这个错误:object INDEX is in use

【问题讨论】:

请参阅工具/分析 IBExpert 中的依赖关系,可能这个索引被其他对象使用,但 PK(唯一约束、外键约束等)。愚蠢的选项是工具/将元数据导出到文本文件中,然后将这个巨大的 SQL 脚本加载到任何程序员编辑器中,并使用简单的文本搜索来搜索该索引名称。此外,工具/搜索元数据也很有帮助。 另外,我真的不确定这种从字符串到数字的类型更改是否真的有效。即使会 - 您最好在此之后立即更新整个表格:update tablename set code = 0 + cast( code as integer) 以将所有记录转换为新格式。正确的方法实际上是创建新列,然后填充它,然后删除旧列,然后重命名新列。如果其他数据库对象使用旧列会很麻烦,这似乎是这种情况 @Arioch'The 感谢您的帮助,似乎是依赖问题。 ...并且由于在 FB 中没有“无效因此未实例化”依赖的概念,因此您可能会遇到展开洋葱的艰难历程。有时从提取元数据脚本创建 EMPTY 数据库然后将数据泵入新的空壳会更容易 此外,即使是现有的数据库连接也可能使用一些元数据对象,具体取决于事务设置(等待/不等待,AFAIR)。至少对于存储过程是这样,不确定 PK 和索引。但是一个活跃的SELECT 当然可以使用一些索引,同意吗? 【参考方案1】:

object INDEX is in use 错误的确切含义是:对象正在使用中,例如在准备好的语句的查询计划中。为了能够修改它,您需要确保没有任何东西对该对象持有存在锁,最简单的方法是shutdown the database using gfix,进行更改并再次将您的数据库设置为在线。

【讨论】:

以上是关于如果它是主键并且被索引,如何更改列的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL索引

mysql 索引2

mysql主键索引(id=和id in)查询慢问题

数据库索引类型

sql主键和索引

在oracle中,创建表时,不创建主键,有没有默认索引?如果有,是啥索引?