我正在尝试创建一个包含以下内容的表:

CREATE TABLE GTW_WORKFLOW_MON 
(
    WORKFLOW_NAME VARCHAR(255) NOT NULL, 
    WORKFLOW_LOADED NUMERIC(20) NOT NULL, 
    ACTIVITY_NAME VARCHAR(255) NOT NULL,
    FLAGS INTEGER NOT NULL,
    MONITOR_NAME VARCHAR(255) NOT NULL,
    CLASSNAME VARCHAR(255) NOT NULL,
    STR0 VARCHAR(255),
    STR1 VARCHAR(255),
    STR2 VARCHAR(255), 
    NUM0 VARCHAR(255), 
    NUM1 VARCHAR(255), 
    NUM2 VARCHAR(255), 
    DATE0 VARCHAR(255),
    DATE1 VARCHAR(255), 
    DATE2 VARCHAR(255), 
    PRIMARY KEY (WORKFLOW_NAME, WORKFLOW_LOADED, ACTIVITY_NAME, MONITOR_NAME)
)

由于列长度不够大而失败。

有帮助吗?

解决方案

如果 SQL 语句在语法上有效并且您提供了准确的错误消息,这将会有所帮助。重新格式化并更正语法后,该语句如下所示:

CREATE TABLE gtw_workflow_mon
(
    workflow_name   VARCHAR(255) NOT NULL,
    workflow_loaded NUMERIC(20) NOT NULL,
    activity_name   VARCHAR(255) NOT NULL,
    flags           INTEGER NOT NULL,
    monitor_name    VARCHAR(255) NOT NULL,
    classname       VARCHAR(255) NOT NULL,
    str0            VARCHAR(255),
    str1            VARCHAR(255),
    str2            VARCHAR(255),
    num0            VARCHAR(255),
    num1            VARCHAR(255),
    num2            VARCHAR(255),
    date0           VARCHAR(255),
    date1           VARCHAR(255),
    date2           VARCHAR(255),
    PRIMARY KEY(workflow_name, workflow_loaded, activity_name, monitor_name)
);

并且,当它在具有 2KB 页的系统上运行时,错误消息为:

SQL -550: Total length of columns in constraint is too long.

获取错误消息简要说明的标准方法是 finderr;它说:

$ finderr -550
-550    Total length of columns in constraint is too long.

The total size of all the columns listed in a UNIQUE, PRIMARY KEY, or
FOREIGN KEY clause is limited. The limit depends on the database server
in use, but all servers support a total of 120 bytes. The limit is the
same as the restriction on the total size of all columns in a composite
index. For additional information, see the CREATE TABLE statement in
the IBM Informix Guide to SQL: Syntax.

$

其中“总共120字节”应该是“总共至少120字节”;该下限适用于 Informix SE。在 IDS(Informix Dynamic Server)中,下限为 255 字节,但在较新的系统中该值更大,并且当页面大小较大时该值也更大。

您有多种选择。

  • 您可以考虑为什么您的名字每个需要 255 个字符 - 这是否合理(比如 64 个字符就足够了)?
  • 如果您的服务器版本足够新(我相信是 10.00 或更高版本),您可以在具有更大页面大小的 dbspace 中创建表。

由于密钥的最大长度为 3*255+(20/2+1) = 776 字节,并且经验法则是您需要能够存储 5 个最大长度密钥值 + ROWID/FRAGID 开销(8 字节)每页需要 4 KB 的页面大小。(如果您在 AIX 上运行,您可能不会注意到这个问题。)

另外,您不应该将日期值存储在 VARCHAR(255) 中;你应该使用 DATE 或者 DATETIME YEAR TO DAY (一种奇怪的 DATE 拼写方式 - 尽管底层格式不同,在磁盘上使用 5 个字节而不是 4 个字节来表示普通 DATE),或者 DATETIME YEAR TO SECOND (一种有趣的方式拼写时间戳),或...“num0、num1、num2”字段也很可疑;如果它们要存储数字,请使用 NUMERIC 或 DECIMAL - 大多数 IDS 数据库中的 DECIMAL(20) 表示 20 位浮点十进制数。

编辑添加:

并且,为了回答直接问题,VARCHAR 列的长度最多只能为 255 个字节;LVARCHAR 列最大可达 32 KB 左右;CHAR 列最大可达 32 KB;TEXT 列最大可达 2 GB,CLOB 列甚至可以更大。行的总长度限制为大约 32 KB(但 BYTE、TEXT、BLOB 和 CLOB 列算作固定大小描述符,总长度为 32 KB - 实际数据存储在行外部)。有一些版本依赖性我没有提供 - 如果您使用的是 IDS 10.00 或更高版本,这是准确的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top