密钥大小超过了使用UDF调用的表达式索引的实现限制

时间:2017-01-24 08:02:42

标签: firebird udf firebird2.5

自版本 2.0 以来,

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 questionF_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;

为什么密钥大小超过?

1 个答案:

答案 0 :(得分:1)

长话短说:你有没有试过把它关掉再打开?

在更改UDF声明之后和添加表达式索引之前,似乎必须断开连接并连接

现在,它运作正常。密钥大小不再超过。