有外键时更新表

时间:2019-04-06 10:36:39

标签: sql oracle

表格:

FILM (Catalog_Num(pk), Format, Title, Year, Number_Discs, Rating, Timing, Genre) 

INVENTORY (Film_ID(pk), Rental_Price, New, Date_In, Catalog_Num@, Store_Num@)

这是电影表的一部分,内容有些错误,例如:23W应该是23F,因为它的格式是 F 全屏。

CATALALOG_NUM FORMAT
------------- --------------------
16W           Wide Screen
17F           Full Screen
23W           Full Screen
24F           Full Screen

如果有错误,我必须更新胶片表中的内容。 这是我尝试过的:

update film
set catalog_num = REPLACE(catalog_num,substr(catalog_num, -1, 1),substr(format, 1,1))

我认为是将catalog_num列中的所有最后一个字符直接替换为format列中的第一个字符。 但是,由于这两个表之间有外键,因此出现错误:

ERROR at line 1:
ORA-02292: integrity constraint (SYS.INVENTORY_CATALOG_FK) violated - child record found

是否有任何解决方案可在一个查询中解决此问题,并且不需要使用级联或禁用约束? 谢谢!

1 个答案:

答案 0 :(得分:0)

哦,使用自动生成的外键的 not 麻烦!您的VBA应该包含“真实”信息。它应该只是一个引用新值的数字。

您还选择了唯一(或少数几个)不支持级联约束更新的数据库。

我的建议是修复您的数据模型。

您可能要创建具有以下特征的新表:

  • Set web = CreateObject("WinHttp.WinHttpRequest.5.1") web.Open "GET", "/api/list/", False web.SetRequestHeader "Authorization", "Bearer <JWT_TOKEN_HERE>" web.Send 有一个catalog_num列,该列唯一地标识了每一行而已。它可以自动生成为串行列,也可以使用触发器分配,具体取决于您的Oracle版本。
  • Films的格式应为一列。哦,您已经知道了,并且已经了解了存储冗余数据的问题。
  • 如果您需要“ catalog_num”列,则该列应为单独列,并且不用于外键关系
  • film_id应该有一个Films列,而根本没有Inventory列。

您也可以适当地进行这些更改。但是,最佳方法取决于您的Oracle版本,是否需要保留当前表以及其他因素。