Pergunta

Eu estou tentando criar uma tabela com o seguinte:

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

Ele falha devido ao comprimento da coluna não ser grande o suficiente.

Foi útil?

Solução

Seria bom se a instrução SQL foi sintaticamente válido e se você tiver fornecido a mensagem de erro exata. Quando reformatado e sintaxe corrigido, a declaração parece com:

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

E, quando isso é executado em um sistema com 2 KB páginas, a mensagem de erro é:

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

A forma padrão de obter uma breve explicação de uma mensagem de erro é finderr; ele diz:

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

$

O 'um total de 120 bytes' deve ser 'um total de pelo menos 120 bytes'; que limite inferior aplica-se a Informix SE. Em IDS (Informix Dynamic Server), o limite inferior é de 255 bytes, mas é maior em sistemas mais recentes, e também maior quando o tamanho da página é maior.

Você tem uma variedade de opções.

  • Você pode considerar porque seus nomes precisam ser 255 caracteres cada - é que sensível (seria, digamos, 64 ser suficiente)
  • ?
  • Se a sua versão do servidor é suficiente recente (10,00 ou mais tarde, creio eu), você pode criar a tabela em um dbspace com um tamanho de página maior.

Uma vez que a chave é um máximo de 3 * 255 + (20/2 + 1) = 776 bytes, e a regra de ouro é que você precisa para ser capaz de armazenar 5 valores de chave máxima de comprimento + ROWID / sobrecarga FRAGID ( 8 bytes) por página, você precisaria de um tamanho de página de 4 KB. (Você tinha sido executado no AIX, você provavelmente não teria notado a questão.)

Além disso, você não deve armazenar valores de data em VARCHAR (255); você deve usar DATE ou talvez DATETIME ANO PARA O DIA (uma maneira estranha de DATA ortografia - embora o formato subjacente é diferente, usando 5 bytes no disco em vez de 4 para uma data normal), ou talvez DATETIME ANO PARA SEGUNDA (um jeito engraçado de TIMESTAMP ortografia), ou ... Os 'NUM0, num1, num2' campos também são duvidosos, também; se eles são destinados a armazenar os números de uso, numérico ou DECIMAL -. decimal (20), na maioria dos meios de bases de dados de IDS um número ponto decimal de 20 dígitos flutuante

Editado para adicionar:

E, para responder à pergunta direta, colunas VARCHAR só pode ser de até 255 bytes de comprimento; colunas LVARCHAR pode ser de até cerca de 32 KB; colunas CHAR pode ser de até 32 KB; colunas de texto podem ser de até 2 GB, e colunas CLOB pode ser ainda maior. O comprimento total de uma linha é limitada a cerca de 32 KB (mas BYTE, TEXTO, gota e CLOB colunas contar como um descritor de tamanho fixo para que 32 KB total de - os dados reais são armazenados fora da linha). Existem algumas dependências de versão que eu não estou trazendo para fora -. Se você estiver usando IDS 10.00 ou posterior, essa é precisa

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top