微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将现有外部约束更改为新表

如何解决将现有外部约束更改为新表

在我的数据库中,我有一张桌子:

USER
----
Id      Number
Name    Varchar
SSN     Number

出于某种原因,我们想将 SSN 更改为 Varchar。因为它不是空的,所以我们创建了一个新表而不是改变现有的:

USER2
-----
Id      Number
Name    Varchar
SSN     Varchar

将所有数据从 USER 复制到 USER2

然后将原来的 USER 重命名USER_BACKUP

USER2 重命名USER

我知道这是一个糟糕的方法,但不幸的是它已经完成并正在使用中。

截至今天,新的 USER 表领先于 USER_BACKUP,因为现在已经添加删除了一些数据。

现在有 2 个现有表 ADDRESSUSER_ADDRESS

USER_ADDRESS 使用用户 ID(Foreign_Key) 和地址 ID(Foreign_Key) 存储 USERADDRESS间的关系数据。

USER_ADDRESS
------------
Id          Number
User_id     Number
Address_Id  Number

但是由于原来的USER被重命名了,外部约束也被重命名了,并没有指向新的USER,而是指向了USER_BACKUP,这不是我想要的。

USER_BACKUP 中的数据现在与我无关。

我应该遵循哪些步骤将 USER_ADDRESS 指向新的 USER 表,而不影响两个表中的数据。

请提出建议。

附言- 我们使用的是 Oracle 18C。

解决方法

添加新约束并删除旧约束。

ALTER TABLE user_address ADD CONSTRAINT user_address__id__fk
  FOREIGN KEY (user_id) REFERENCES "USER" ( id );
ALTER TABLE user_address DROP CONSTRAINT name_of_previous_fk_to_user_backup;

如果两个表中的数据仍然足够相似,那么它就会起作用。

如果您从新的 USER 表中删除了仍在 USER_BACKUP 中并从 USER_ADDRESS 表中引用的项目,那么它将失败,您需要协调表。

dbfiddle here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。