Domanda

Sto cercando di creare una tabella con il seguente:

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

Non riesce a causa della lunghezza della colonna non abbastanza grande.

È stato utile?

Soluzione

Sarebbe utile se l'istruzione SQL fosse sintatticamente valida e se fornissi il messaggio di errore esatto. Quando riformattata e corretta la sintassi, la dichiarazione appare come:

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 viene eseguito su un sistema con pagine da 2 KB, il messaggio di errore è:

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

Il modo standard per ottenere una breve spiegazione di un messaggio di errore è 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.

$

'un totale di 120 byte' dovrebbe essere 'un totale di almeno 120 byte'; tale limite inferiore si applica a Informix SE. In IDS (Informix Dynamic Server), il limite inferiore è di 255 byte, ma è più grande nei sistemi più recenti e anche più grande quando la dimensione della pagina è maggiore.

Hai una varietà di opzioni.

  • Puoi considerare perché i tuoi nomi devono contenere 255 caratteri ciascuno - è ragionevole (diciamo che 64 sarebbe sufficiente)? ??
  • Se la versione del tuo server è abbastanza recente (10.00 o successiva, credo), potresti creare la tabella in uno spazio dbs con dimensioni di pagina maggiori.

Poiché la chiave è un massimo di 3 * 255 + (20/2 + 1) = 776 byte e la regola empirica è che devi essere in grado di memorizzare 5 valori chiave di lunghezza massima + ROWID / FRAGID overhead ( 8 byte) per pagina, avrai bisogno di una dimensione di pagina di 4 KB. (Se avessi eseguito AIX, probabilmente non avresti notato il problema.)

Inoltre, non dovresti archiviare i valori della data in VARCHAR (255); dovresti usare DATE o forse DATETIME YEAR TO DAY (uno strano modo di scrivere DATE - sebbene il formato sottostante sia diverso, usando 5 byte su disco anziché 4 per una semplice DATE), o forse DATETIME YEAR TO SECOND (un modo divertente di ortografia TIMESTAMP), oppure ... Anche i campi 'num0, num1, num2' sono anch'essi dubbi; se sono destinati a memorizzare numeri, utilizzare NUMERIC o DECIMAL - DECIMAL (20) nella maggior parte dei database IDS significa un numero decimale a virgola mobile di 20 cifre.

Modificato per aggiungere:

E, per rispondere alla domanda diretta, le colonne VARCHAR possono avere una lunghezza massima di 255 byte; Le colonne LVARCHAR possono avere una dimensione massima di circa 32 KB; Le colonne CHAR possono avere una dimensione massima di 32 KB; Le colonne TEXT possono contenere fino a 2 GB e le colonne CLOB possono essere anche più grandi. La lunghezza totale di una riga è limitata a circa 32 KB (ma le colonne BYTE, TEXT, BLOB e CLOB contano come descrittori di dimensioni fisse per quel totale di 32 KB - i dati effettivi vengono archiviati all'esterno della riga). Ci sono alcune dipendenze della versione che non sto evidenziando: se stai usando IDS 10.00 o successivo, questo è accurato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top