如果您的表是数据库容器 (*.DBC) 的一部分而不是空闲表,那么您可能会找到代码来自动增加数据库容器中的键。
如果您打开表格并使用 MODIFY STRUCTURE 命令,您可以在第三个选项卡上看到表格的属性。如果表是数据库容器的成员,则将显示数据库的名称以及任何规则,包括触发器和记录规则,这些规则在每次写入表时执行。
在添加自动递增字段之前,我通过添加如下记录规则来实现自动递增字段:
PROCEDURE TABLE_RR
LOCAL nOldArea,nUnique
IF PK=0 &&Only update primary key field when not already set
STORE SELECT() TO nOldArea
&&Open table again in another work area, we can't move the record pointer in a Rule
IF !USED("TABLE_RR")
USE TABLE.DBF IN 0 NOUPDATE AGAIN ALIAS TABLE_RR
ENDIF
&&Find current maximum value of primary key field, add 1 as next primary key field
SELECT TABLE_RR
SET ORDER TO PKTable
GO BOTT
STORE 1+PK TO nUnique
&&Update primary key field for our record
SELECT(nOldArea)
REPLACE PK WITH nUnique
ENDIF
&&Record rule must return true or changes are rejected
RETURN .T.
ENDPROC
将这样的规则存储在数据库容器存储过程代码区是很正常的习惯和做法,但是,只要正在运行的应用程序能够找到该函数,它就会执行。显然,上面的代码示例假定表名为 TABLE,有一个名为 PK 的数字(最好是 Int)字段,索引标签为 PKTable。
因为代码在记录规则中,它在任何更新期间都会在记录上执行,因此在记录被锁定时,不会发生冲突。 PK 中没有值的任何记录都会得到 1 + 该字段的当前最高值。记录规则旨在验证记录并拒绝无效值,并且必须返回 true (.T.) 才能接受写入。过程中可能会出现其他代码,包括将当前值设置为时间戳字段等。
记录规则可以通过ALTER TABLE命令应用于表:
ALTER TABLE 'TABLENAME' SET CHECK PROCEDURENAME()
或通过 MODIFY STRUCTURE 中的交互式表格编辑器