Quelle est la longueur maximale d’une colonne Informix et peut-elle être augmentée?

StackOverflow https://stackoverflow.com/questions/172227

  •  05-07-2019
  •  | 
  •  

Question

J'essaie de créer une table avec les éléments suivants:

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

Il échoue car la longueur de la colonne n'est pas assez grande.

Était-ce utile?

La solution

Cela aiderait si l'instruction SQL était syntaxiquement valide et si vous fournissiez le message d'erreur exact. Une fois reformaté et la syntaxe corrigée, l'instruction se présente comme suit:

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

Et, lorsqu'il est exécuté sur un système avec des pages de 2 Ko, le message d'erreur est le suivant:

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

La méthode standard pour obtenir une brève explication d'un message d'erreur est finderr ; il dit:

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

$

Le "total de 120 octets" doit être "au moins 120 octets au total"; cette limite inférieure s'applique à Informix SE. Dans IDS (Informix Dynamic Server), la limite inférieure est de 255 octets, mais elle est plus grande dans les systèmes plus récents et également plus grande lorsque la taille de la page est plus grande.

Vous avez diverses options.

  • Vous pouvez comprendre pourquoi votre nom doit comporter 255 caractères - est-ce raisonnable (64 suffirait-il)?
  • Si la version de votre serveur est suffisamment récente (10 ou plus, je crois), vous pouvez créer la table dans un espace de base de données avec une taille de page plus grande.

Étant donné que la clé est au maximum 3 * 255 + (20/2 + 1) = 776 octets, et que la règle générale est que vous devez pouvoir stocker 5 valeurs de clé de longueur maximale + ROWID / FRAGID overhead ( 8 octets) par page, vous aurez besoin d’une taille de page de 4 Ko. (Si vous utilisiez AIX, vous n’auriez probablement pas remarqué le problème.)

De même, vous ne devriez pas stocker de valeurs de date dans VARCHAR (255); vous devez utiliser DATE ou peut-être DATETIME ANNÉE AU JOUR (une étrange façon d’orthographier DATE - bien que le format sous-jacent soit différent, utiliser 5 octets sur le disque au lieu de 4 pour une DATE ordinaire), ou peut-être DATETIME ANNÉE À SECOND (une manière amusante orthographe TIMESTAMP), ou ... Les champs 'num0, num1, num2' sont également douteux; s’ils sont destinés à stocker des nombres, utiliser NUMERIC ou DECIMAL - DECIMAL (20) dans la plupart des bases de données IDS signifie un nombre décimal à 20 chiffres en virgule flottante.

Modifié pour ajouter:

Et pour répondre à la question directe, les colonnes VARCHAR ne peuvent contenir que 255 octets; Les colonnes LVARCHAR peuvent atteindre environ 32 Ko; Les colonnes CHAR peuvent aller jusqu'à 32 Ko; Les colonnes TEXT peuvent atteindre 2 Go et les colonnes CLOB peuvent être encore plus grandes. La longueur totale d'une ligne est limitée à environ 32 Ko (mais les colonnes BYTE, TEXT, BLOB et CLOB comptent comme un descripteur de taille fixe pour ce total de 32 Ko - les données réelles sont stockées en dehors de la ligne). Certaines versions ne dépendent pas de moi. Si vous utilisez IDS 10.00 ou une version ultérieure, cette information est exacte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top