2008-10-05 224 views
2

我试图创建一个表具有以下:Informix列的最大长度是多少?可以增加多少?

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) 
) 

它失败,因为没有被列长度足够大。

回答

11

如果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(一种有趣的方式拼写TIMESTAMP),或者...'num0,num1,num2'字段也是可疑的;如果它们用于存储数字,则在大多数IDS数据库中使用NUMERIC或DECIMAL - 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或更高版本,则这是准确的。

相关问题