sqlite U2宇宙:更新多值字段

yebdmbv4  于 2023-06-06  发布在  SQLite
关注(0)|答案(3)|浏览(372)

我有一个设置为多值的DICT。当打开TCL并执行UPDATE DICT.FILE SET Blah = 'Y'语句时,我得到以下错误:

Correlatives are illegal for UPDATE, column "Blah"

如何更新多值字段中的特定属性?

apeeds0o

apeeds0o1#

从技术上讲,多值数据库中的关联在与SQL交互时被视为不同的表。例如,假设您有一个名为INV的Invoice文件,其DICT如下所示。

DICT INV    08:16:43  08-01-16  Page 1

               Type &
Field......... Field. Field........ Conversion.. Column......... Output Depth &
Name.......... Number Definition... Code........ Heading........ Format Assoc..

@ID            D    0                            INV             10L    S
CustNum        D    1                                            5R     S
PartNum        D    2                                            8R     M LineI
                                                                        tem
Quantity       D    3                                            5R     M LineI
                                                                        tem

4 records listed.
>

您将无法使用尝试更新PartNumber的命令,因为您没有指定要与PartNumber关联的@ID。例如,你不会说…

UPDATE INV SET PartNumber = 123456;

..,因为它没有意义并且会使隐式外键约束失败。
此外,UPDATE可能不是您想要在这里使用的命令,因为如果您有一张@ID为123的发票,并且想要向其添加PartNumber和Quantity,您可能想要执行以下操作。

INSERT INTO INV (@ID, PartNum, Quantity) VALUES (123, 123456, 2);

从这里,您可能希望可以通过发出以下命令来更新INV 123,PartNum 123456的数量...

UPDATE INV SET Quantity = 7 WHERE @ID = 123 WHEN PartNum = 123456;

但是如果你尝试,宇宙会抱怨没有一个叫做LineItem的关联。
至于更新去,你需要有你的DICT文件真的很好地组织,让它按预期工作。我建议你阅读Universe SQL参考指南(用户,参考和DBA)。你可以找到那些Here。简而言之,您需要在DICTs中为每个MV关联提供PH记录,并且您可能希望了解您的关联是稳定的、不稳定的(默认)还是有一个KEY。但这对这个练习来说有点深。
我在DICT中为关联行项目添加了一条PH记录。

DICT INV    08:38:16  08-01-16  Page 1

               Type &
Field......... Field. Field........ Conversion.. Column......... Output Depth &
Name.......... Number Definition... Code........ Heading........ Format Assoc..

@ID            D    0                            INV             10R    S
CustNum        D    1                                            5R     S
PartNum        D    2                                            8R     M LineI
                                                                        tem
Quantity       D    3                                            5R     M LineI
                                                                        tem
LineItem       PH     PartNum
                      Quantity

5 records listed.

现在,这允许我按预期更新数量。

>UPDATE INV SET Quantity = 7 WHERE @ID = 123 WHEN PartNum = 123456;
UniVerse/SQL: 1 record updated.
>SELECT @ID, PartNum, Quantity FROM INV WHERE @ID = 123;
INV.......    PartNum.    Quantity

       123      123456           7

1 records listed.
>

希望这能帮上忙。

2ledvvac

2ledvvac2#

更新多值字段的另一种方法是调用UniVerse编辑器ED命令。例如,在TCL中:

ED FILENAME RECORDID

要获取有关编辑器命令的详细信息,请在TCL中键入HELP
来源:Guide to the UniVerse Editor

h9a6wy2h

h9a6wy2h3#

多值字段可以使用动态规范化在UniverseSQL中引用。
下划线是规范化虚拟表中主表和多值相关表之间的分隔符。
此查询替换未关联的多值字段中的值:

UPDATE MAINTABLE_MULTIVALUE 
SET MULTIVALUE = 'newvalue' 
WHERE @ID = 'keyvalue' AND MULTIVALUE = 'oldvalue'

关联字段可以关联地引用:

UPDATE MAINTABLE_MULTVALUEASSOC 
SET ASSOCFIELD1 = 'newvalue' 
WHERE @ID = 'keyvalue' AND ASSOCFIELD2 = 'something'

待替换的多值的序数位置可以在关联和非关联多值字段两者中被指定。

UPDATE MAINTABLE_MULTIVALUE 
SET MULTIVALUE = 'newvalue' 
WHERE @ID = 'keyvalue' AND @ASSOC_ROW = 2

关联字段与关联字段之间用点分隔开,以防出现歧义(例如,如果同一字段名在联接中的多个表中)。Universe能够处理所有名称中的下划线和点以及分隔符,前提是完整引用中没有歧义。

SELECT MAINTABLE_MULTIVALUEASSOC.ASSOCFIELD1
FROM MAINTABLE_MULTIVALUEASSOC
INNER JOIN someothertable ON etc

请注意,主表和动态规范化相关表的默认键@ID始终是字符串。WHEN条件在动态规范化结构中无效。

相关问题