Pregunta

Estoy intentando crear una tabla con lo siguiente:

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

Falla debido a que la longitud de la columna no es lo suficientemente grande.

¿Fue útil?

Solución

Ayudaría si la declaración de SQL fuera sintácticamente válida y si proporcionara el mensaje de error exacto. Cuando se reformatea y se corrige la sintaxis, la declaración parece:

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

Y, cuando se ejecuta en un sistema con páginas de 2 KB, el mensaje de error es:

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

La forma estándar de obtener una breve explicación de un mensaje de error es finderr ; dice:

$ 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.

$

El 'un total de 120 bytes' debe ser 'un total de al menos 120 bytes'; ese límite inferior se aplica a Informix SE. En IDS (Informix Dynamic Server), el límite inferior es de 255 bytes, pero es más grande en los sistemas más recientes y también más grande cuando el tamaño de la página es más grande.

Tiene una variedad de opciones.

  • Puede considerar por qué sus nombres deben tener 255 caracteres cada uno, ¿es eso sensato (por ejemplo, 64 sería suficiente)? ??
  • Si la versión de su servidor es lo suficientemente reciente (creo que a las 10.00 o posterior), podría crear la tabla en un espacio de base de datos con un tamaño de página mayor.

Dado que la clave es un máximo de 3 * 255 + (20/2 + 1) = 776 bytes, y la regla general es que debe poder almacenar 5 valores de clave de longitud máxima + sobrecarga ROWID / FRAGID ( 8 bytes) por página, necesitaría un tamaño de página de 4 KB. (Si hubiera estado ejecutando en AIX, probablemente no habría notado el problema).

Además, no debe almacenar valores de fecha en VARCHAR (255); debe usar DATE o quizás DATETIME YEAR TO DAY (una extraña forma de deletrear DATE, aunque el formato subyacente es diferente, usar 5 bytes en el disco en lugar de 4 para una FECHA simple), o tal vez DATETIME YEAR TO SECOND (una forma divertida de ortografía TIMESTAMP), o ... Los campos 'num0, num1, num2' también son dudosos; si están destinados a almacenar números, use NUMERIC o DECIMAL - DECIMAL (20) en la mayoría de las bases de datos IDS significa un número decimal de coma flotante de 20 dígitos.

Editado para agregar:

Y, para responder la pregunta directa, las columnas VARCHAR solo pueden tener hasta 255 bytes de longitud; Las columnas LVARCHAR pueden tener hasta aproximadamente 32 KB; Las columnas CHAR pueden ser de hasta 32 KB; Las columnas de TEXTO pueden ser de hasta 2 GB, y las columnas CLOB pueden ser incluso más grandes. La longitud total de una fila está limitada a aproximadamente 32 KB (pero las columnas BYTE, TEXT, BLOB y CLOB cuentan como un descriptor de tamaño fijo para ese total de 32 KB: los datos reales se almacenan fuera de la fila). Hay algunas dependencias de versión que no estoy revelando, si está utilizando IDS 10.00 o posterior, esto es correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top