0

我有一个 FoxPro 容器 DBC,里面有几个 DBF 表。这些表具有以下结构:

TableA(id, numbers1, numbers2, numbers3)

numbers1、numbers2 和 numbers3 是数字逗号分隔的字符串,如下所示:

numbers1 = '01,02,03,04,05,06,07,08' --> 8 numbers
numbers2 = '09,10,11,12,13,14,15,16' --> 8 numbers
numbers3 = '01,02,03,04,05,06,07,08,09,10,11,12,13,14,15' --> 15 numbers

数字不能在同一行之间和整个表格中重复,因此顶部的 numbers1 不能出现在 numbers1 或 numbers2 的另一行。

所以,为了防止这种情况......我在列 numbersX 上应用索引,如下所示:

INDEX ON numbers1 CANDIDATE TAG numbers1
INDEX ON numbers2 CANDIDATE TAG numbers2
INDEX ON numbers3 CANDIDATE TAG numbers3

但这......只能防止在同一列上没有重复......所以:

RowA.numbers1 cant be equal to RowB.numbers1

但这可能会发生:

RowA.numbers1 = RowB.numbers2

而我不想那样......

所以我的问题是我该如何解决这个问题?我认为在两列上做多个索引,可以做到吗?我在 mysql 或 sql server 中考虑更多,但我不知道这是否适用于 foxpro。

4

1 回答 1

2

您无法以简单的方式解决此问题,因为您的表尚未标准化。您可能应该有一个表,其中包含与给定 ID 相关联的一对列

create table tblIDNums ( id int, num int )

在 NUM 列上创建唯一索引,因此它永远不能与任何 OTHER ID 相关联,除非它被重新分配,除非它被重新分配,否则它被分配到的第一个条目,只需更新 id 列。

然后,插入您的记录,例如

insert into tblIDNums ( id, num ) values ( 1, 1 )
insert into tblIDNums ( id, num ) values ( 1, 2 )
insert into tblIDNums ( id, num ) values ( 1, 3 )
insert into tblIDNums ( id, num ) values ( 1, 4 )
insert into tblIDNums ( id, num ) values ( 1, 5 )
insert into tblIDNums ( id, num ) values ( 1, 6 )
insert into tblIDNums ( id, num ) values ( 1, 7 )
insert into tblIDNums ( id, num ) values ( 1, 8 )
insert into tblIDNums ( id, num ) values ( 2, 9 )
insert into tblIDNums ( id, num ) values ( 2, 10 )
insert into tblIDNums ( id, num ) values ( 2, 11 )
insert into tblIDNums ( id, num ) values ( 2, 12 )
insert into tblIDNums ( id, num ) values ( 2, 13 )
insert into tblIDNums ( id, num ) values ( 2, 14 )
insert into tblIDNums ( id, num ) values ( 2, 15 )
insert into tblIDNums ( id, num ) values ( 2, 16 )

因此,现在,如果您尝试插入值为 13 的 ID 3,则插入将失败,因为 13 与 ID 2 相关联。您不能仅用逗号分隔预期的数值,因为它将其视为整个字符串,而不是个人价值观本身,并知道它们是否是顺序的、间隙的、无序的等。

于 2013-08-23T04:43:10.013 回答