【问题标题】:Easiest way to change an Primary Key from a string to a number将主键从字符串更改为数字的最简单方法
【发布时间】:2012-11-21 19:40:17
【问题描述】:

我正在处理的数据库最初是(由其他人)将所有主键(和关联的外键)作为字符串进行原型设计的。键确实需要是数字。

数据库有 16 个表,其中包含最少的测试数据。所有数据的关键字段中都有数字。

解决此问题的最简单方法是什么?

【问题讨论】:

  • 我开始在 SQL Developer 中手动执行此操作,这似乎意味着删除链接,删除现有主键,创建新主键,重命名现有外键,创建新外键,复制数据,创建新链接,删除旧外键。这样做 21 次似乎真的很痛苦。
  • 我在 VS2010 中使用实体框架并尝试更改实体模型 (edms) 中一对 PK/FK 对的数据类型,然后选择“从模型更新数据库”。它似乎创建了相关的 SQL 来进行更改;但它显示“未连接”并且没有进行更改。

标签: database oracle entity-framework schema


【解决方案1】:

不确定“最小测试数据”究竟是什么意思,但您可以使用 SQL Developer 做到这一点:

  1. 导出表 DDL
  2. 将数据导出为插入语句
  3. 修改 1 中生成的 DDL 脚本,将您的列更新为 NUMBER 类型
  4. 删除并重新创建架构
  5. 从 3 到 2 应用脚本。

【讨论】:

  • 在这种情况下,用于测试的最小数据是 1-10 条记录/表如果我有更多经验和/或我有办法备份和恢复数据库,那么删除和重新创建听起来很简单出错;但是,我没有。所以,目前这种方法对我来说风险太大。
【解决方案2】:

我创建了一个 SQL 脚本来对单个关联进行更改,然后我将对其进行修改并重复 20 次以上。

我做了第一个表(MODULES.ID 到 MODULE_SESSIONS.MODULE_ID 关联)并且它有效。 这是我使用的脚本:

alter table MODULE_SESSIONS drop constraint FK_MODULE_MODULE_SESSION_FK1;
alter table MODULES drop constraint MODULES_PK;
alter table MODULES rename column ID to OLD;
alter table MODULES add ID INTEGER;
update MODULES set ID = OLD;
alter table MODULES drop column OLD;
alter table MODULE_SESSIONS rename column MODULE_ID to OLD;
alter table MODULE_SESSIONS add MODULE_ID INTEGER;
update MODULE_SESSIONS set MODULE_ID = OLD;
alter table MODULES add constraint MODULE_PK primary key(ID); 
alter table MODULE_SESSIONS add constraint FK_MODULE_MODULE_SESSION_FK1 foreign key(MODULE_ID) references MODULES(ID);
alter table MODULE_SESSIONS drop column OLD;

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 2016-07-28
    • 2015-12-15
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多