Firebird 允许indexing on expressions。这包括使用对用户定义函数(UDF)的调用。
目前,我正在尝试为此表添加表达式索引:
CREATE TABLE M_ADSN_STRING_DATA (
ID DMN_AUTOINC NOT NULL /* DMN_AUTOINC = INTEGER NOT NULL */,
CLTREF DMN_REFID /* DMN_REFID = INTEGER NOT NULL */,
ATTRIBUTEDATA DMN_AFT_STRING /* DMN_AFT_STRING = VARCHAR(320) NOT NULL */
);
/******************************************************************************/
/**** Unique constraints ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT UNQ_M_ADSN_STRING_DATA UNIQUE (CLTREF, ATTRIBUTEDATA);
/******************************************************************************/
/**** Primary keys ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT PK_M_ADSN_STRING_DATA PRIMARY KEY (ID);
/******************************************************************************/
/**** Foreign keys ****/
/******************************************************************************/
ALTER TABLE M_ADSN_STRING_DATA ADD CONSTRAINT FK_M_ADSN_STRING_DATA_CLT FOREIGN KEY (CLTREF) REFERENCES M_CLIENT (ID) ON DELETE CASCADE ON UPDATE CASCADE;
/******************************************************************************/
/**** Indices ****/
/******************************************************************************/
CREATE INDEX M_ADSN_STRING_DATA_AD_UC ON M_ADSN_STRING_DATA COMPUTED BY (UPPER(ATTRIBUTEDATA));
请注意,它已经有一个名为M_ADSN_STRING_DATA_AD_UC
的表达式索引。
我想要使用的索引应如下所示:
CREATE INDEX M_ADSN_STRING_DATA_AD_DIG
ON M_ADSN_STRING_DATA
COMPUTED BY (F_DIGITS(ATTRIBUTEDATA));
不幸的是,这给了我一条错误信息。
不成功的元数据更新 密钥大小超过索引的实施限制" M_ADSN_STRING_DATA_AD_DIG"
我阅读的Firebird常见问题解答包括#213和#211以及此SO question。
F_DIGITS
是 FreeAdhocUDF库的UDF。最初,它被声明为
DECLARE EXTERNAL FUNCTION F_DIGITS
CSTRING(32760)
RETURNS CSTRING(32760) FREE_IT
ENTRY_POINT 'digits' MODULE_NAME 'FreeAdhocUDF';
由于我的最大输入和输出长度仅为320个字符,因此我将其更改为
DECLARE EXTERNAL FUNCTION F_DIGITS
CSTRING(320)
RETURNS CSTRING(320) FREE_IT
ENTRY_POINT 'digits' MODULE_NAME 'FreeAdhocUDF';
以符合索引大小要求。我的数据库pagesize是16384
。所以,我想,我的密钥可以达到4096字节。
列DMN_AFT_STRING
的域ATTRIBUTEDATA
声明为
CREATE DOMAIN DMN_AFT_STRING AS
VARCHAR(320) CHARACTER SET ISO8859_1
NOT NULL
COLLATE DE_DE_CS_SF;
为什么密钥大小超过?
答案 0 :(得分:1)
长话短说:你有没有试过把它关掉再打开?
在更改UDF声明之后和添加表达式索引之前,似乎必须断开连接并连接。
现在,它运作正常。密钥大小不再超过。