Какова максимальная длина столбца Informix и может ли она быть увеличена? - PullRequest
2 голосов
/ 05 октября 2008

Я пытаюсь создать таблицу со следующим:

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

Сбой из-за недостаточной длины столбца.

1 Ответ

11 голосов
/ 09 октября 2008

Было бы полезно, если бы оператор 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)
);

И, когда он запускается в системе со страницами размером 2 КБ, появляется сообщение об ошибке:

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 или более поздняя), вы можете создать таблицу в пространстве баз данных с большим размером страницы.

Поскольку максимальный размер ключа составляет 3 * 255 + (20/2 + 1) = 776 байт, и практическое правило заключается в том, что вам необходимо сохранить 5 значений ключа максимальной длины + издержки ROWID / FRAGID ( 8 байт) на страницу, вам потребуется размер страницы 4 КБ. (Если бы вы работали в AIX, вы, вероятно, не заметили бы проблему.)

Кроме того, вы не должны хранить значения даты в VARCHAR (255); Вы должны использовать DATE или, возможно, DATETIME YEAR TO DAY (странный способ написания DATE - хотя основной формат отличается, используя 5 байтов на диске вместо 4 для простой DATE), или, возможно, DATETIME YEAR TO SECOND (забавный способ орфография TIMESTAMP), или ... Поля 'num0, num1, num2' также сомнительны; если они предназначены для хранения чисел, используйте NUMERIC или DECIMAL - DECIMAL (20) в большинстве баз данных IDS означает 20-значное десятичное число с плавающей запятой.

Отредактировано, чтобы добавить:

И, чтобы ответить на прямой вопрос, столбцы VARCHAR могут иметь длину до 255 байт; Столбцы LVARCHAR могут иметь размер до 32 КБ; Столбцы CHAR могут быть до 32 КБ; Столбцы TEXT могут иметь размер до 2 ГБ, а столбцы CLOB могут быть еще больше. Общая длина строки ограничена примерно 32 КБ (но столбцы BYTE, TEXT, BLOB и CLOB считаются дескриптором фиксированного размера до общего объема в 32 КБ - фактические данные хранятся вне строки). Существуют некоторые зависимости версий, которые я не выявляю - если вы используете IDS 10.00 или более поздней версии, это точно.

...