表的枚举
Enums for tables
我在 https://code.kx.com/q/ref/enumerate/. But something interesting exists there: https://code.kx.com/q/kb/linking-columns 上的 table 域 上找不到关于 enum
是什么的信息。我尝试了这些示例,发现 enum
结构在某些情况下表现得像 普通 枚举,但在其他情况下表现奇怪。
q)kt:1!t:([]a:`a`b`c;b:10 20 30)
q)tt:([]k:`a`a`a`b;d:11 21 31 41)
q)show et1:`t!t[`a]?tt[`k]
`t!0 0 0 1
q)show et2:`kt$tt[`k]
`kt$`a`a`a`b
q)meta select k,d,et1,et2 from tt
c | t f a
---| ------
k | s
d | j
et1| j t
et2| s kt
q)select r1.a, r1.b, r2.a, r2.b from update r1:et1, r2:et2 from tt
a b a1 b1
----------
a 10 a 10
a 10 a 10
a 10 a 10
b 20 b 20
从这个角度来看,et1
和 et2
都有相似的行为。但是如果我们检查其他 enum
属性,我们会发现差异:
q)et2[0]
`kt$`a
q)et2[0]:`a
q)
q)et1[0]
`t!0
q)et1[0]:0 / neither works this
't
[0] et1[0]:0
^
q)et1[0]:(`a`b!(`a;10)) / nor that
't
[0] et1[0]:(`a`b!(`a;10))
^
如果我们只为键控 table 构建枚举,情况似乎会更奇怪:查看具有一个键列的 table 和两个键列的区别:
q)kkt:2!t:([]a:`a`b`c;b:10 20 30;c:11 22 33)
q)kt:1!0!kkt
q)show ekkt:`kkt$((`a;10);(`b;20);(`b;20))
`kkt!0 1 1
q)show ekt:`kt$(`a`b`b)
`kt$`a`b`b
kkt
的相同硬编码(使用 !
)枚举符号。
所以问题是:它们是什么? - 那些具有熟悉的 $
和 table 的硬编码 !
符号的枚举?是否可以为它们应用 enum-extend
技术 (?
) 以及如何应用?有没有关于它们的文档?
您看到的是 simple foreign key and a linked column 之间的区别。如文档中所述,差异包括:
- 外键专门设计用于 link 键控 table 的键。
- 如果存在不是键控 table
中的键之一的“未知键”,则外键不允许 link
- linked 列可以 link 到任意列(即使值没有出现在其他 table 中 - 因此它不能保证参照完整性)
- linked 列通常用于磁盘 tables
q)kt:([eid:1001 1002 1003] name:`Dent`Beeblebrox`Prefect; iq:98 42 126)
q)tdetails2:([] eid:1003 1001 1002 1001 1002 1001 777;sc:126 36 92 39 98 42 7)
q)update linker:`kt!((0!kt)`eid)?eid from `tdetails2
`tdetails2
q)select linker.name from tdetails2
name
----------
Prefect
Dent
Beeblebrox
Dent
Beeblebrox
Dent
后者不允许用于简单的外键。
另外我不知道您为什么要修改/编辑枚举的值 - 不要那样做!
我在 https://code.kx.com/q/ref/enumerate/. But something interesting exists there: https://code.kx.com/q/kb/linking-columns 上的 table 域 上找不到关于 enum
是什么的信息。我尝试了这些示例,发现 enum
结构在某些情况下表现得像 普通 枚举,但在其他情况下表现奇怪。
q)kt:1!t:([]a:`a`b`c;b:10 20 30)
q)tt:([]k:`a`a`a`b;d:11 21 31 41)
q)show et1:`t!t[`a]?tt[`k]
`t!0 0 0 1
q)show et2:`kt$tt[`k]
`kt$`a`a`a`b
q)meta select k,d,et1,et2 from tt
c | t f a
---| ------
k | s
d | j
et1| j t
et2| s kt
q)select r1.a, r1.b, r2.a, r2.b from update r1:et1, r2:et2 from tt
a b a1 b1
----------
a 10 a 10
a 10 a 10
a 10 a 10
b 20 b 20
从这个角度来看,et1
和 et2
都有相似的行为。但是如果我们检查其他 enum
属性,我们会发现差异:
q)et2[0]
`kt$`a
q)et2[0]:`a
q)
q)et1[0]
`t!0
q)et1[0]:0 / neither works this
't
[0] et1[0]:0
^
q)et1[0]:(`a`b!(`a;10)) / nor that
't
[0] et1[0]:(`a`b!(`a;10))
^
如果我们只为键控 table 构建枚举,情况似乎会更奇怪:查看具有一个键列的 table 和两个键列的区别:
q)kkt:2!t:([]a:`a`b`c;b:10 20 30;c:11 22 33)
q)kt:1!0!kkt
q)show ekkt:`kkt$((`a;10);(`b;20);(`b;20))
`kkt!0 1 1
q)show ekt:`kt$(`a`b`b)
`kt$`a`b`b
kkt
的相同硬编码(使用 !
)枚举符号。
所以问题是:它们是什么? - 那些具有熟悉的 $
和 table 的硬编码 !
符号的枚举?是否可以为它们应用 enum-extend
技术 (?
) 以及如何应用?有没有关于它们的文档?
您看到的是 simple foreign key and a linked column 之间的区别。如文档中所述,差异包括:
- 外键专门设计用于 link 键控 table 的键。
- 如果存在不是键控 table 中的键之一的“未知键”,则外键不允许 link
- linked 列可以 link 到任意列(即使值没有出现在其他 table 中 - 因此它不能保证参照完整性)
- linked 列通常用于磁盘 tables
q)kt:([eid:1001 1002 1003] name:`Dent`Beeblebrox`Prefect; iq:98 42 126)
q)tdetails2:([] eid:1003 1001 1002 1001 1002 1001 777;sc:126 36 92 39 98 42 7)
q)update linker:`kt!((0!kt)`eid)?eid from `tdetails2
`tdetails2
q)select linker.name from tdetails2
name
----------
Prefect
Dent
Beeblebrox
Dent
Beeblebrox
Dent
后者不允许用于简单的外键。
另外我不知道您为什么要修改/编辑枚举的值 - 不要那样做!