Frage

Ich versuche, eine Tabelle mit dem folgenden zu erstellen:

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

Es lässt sich nicht mit Spaltenlänge nicht groß genug ist.

War es hilfreich?

Lösung

Es würde helfen, wenn die SQL-Anweisung syntaktisch gültig ist, und wenn Sie die genaue Fehlermeldung zur Verfügung gestellt. Wenn umformatiert und Syntax korrigiert, sieht die Aussage wie:

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

Und wenn das auf einem System mit 2 KB Seiten ausgeführt wird, ist die Fehlermeldung:

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

Der üblicher Weg eine kurze Erläuterung einer Fehlermeldung zu bekommen ist finderr; es sagt:

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

$

Die ‚insgesamt 120 Bytes‘ sollte ‚insgesamt mindestens 120 Bytes‘ sein; dass untere Grenze gilt für Informix SE. In IDS (Informix Dynamic Server), die untere Grenze ist 255 Bytes, aber es ist größer in neueren Systemen, und auch größer, wenn die Seitengröße größer ist.

Sie haben eine Vielzahl von Optionen.

  • Sie können prüfen, warum Ihre Namen müssen jeweils 255 Zeichen sein - ist das sinnvoll (würde, sagen wir, 64 ausreichend sein)
  • ?
  • Wenn die Server-Version neu genug ist, (10.00 oder später, glaube ich), können Sie die Tabelle mit einer größeren Seitengröße in einem dbspace schaffen könnten.

Da der Schlüssel ist maximal 3 * 255 + (20/2 + 1) = 776 Bytes, und die Faustregel benötigen Sie die 5 wichtigsten Werte maximale Länge + ROWID / FRAGID Overhead speichern können ( 8 Byte) pro Seite, müssen Sie eine 4 KB Seitengröße. (Haben Sie unter AIX laufen, würden Sie wahrscheinlich das Problem nicht bemerkt.)

Außerdem sollten Sie nicht Datumswerte in VARCHAR werden Speicher (255); Sie sollten DATE oder vielleicht DATETIME- Jahr bis Tag verwenden (eine seltsame Art und Weise der Rechtschreibung DATE - obwohl das zugrundeliegende Format unterscheidet, unter Verwendung von 5 Bytes auf der Festplatte statt 4 für einen einfachen DATE), oder vielleicht DATETIME- YEAR TO SECOND (eine lustige Art und Weise der Rechtschreibung timestamp) oder ... Die 'NUM0, num1, num2' Felder sind auch zweifelhaft, auch; wenn sie zum Speichern von Zahlen bestimmt sind, verwenden NUMERIC oder DECIMAL -. DECIMAL (20) in den meisten IDS-Datenbanken bedeutet eine 20-stellige Gleitkomma Dezimalzahl

Edited hinzufügen:

Und die direkte Frage zu beantworten, können VARCHAR Spalten nur bis zu 255 Bytes sein; LVARCHAR Spalten können bis zu etwa 32 KB groß sein; CHAR Spalten können bis zu 32 KB sein; TEXT-Spalten können bis zu 2 GB groß sein, und CLOB Spalten können sogar größer sein. Die Gesamtlänge einer Zeile auf etwa 32 KB begrenzt ist (aber BYTE, TEXT, BLOB und CLOB Spalten zählen als eine feste Größe in Richtung dieses Deskriptors 32 KB Summe - die aktuellen Daten außerhalb der Zeile gespeichert). Es gibt einige Versionsabhängigkeiten, die ich bringe nicht aus -., Wenn Sie mit IDS 10.00 oder später, das ist genau

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top