3

次のテーブルを作成しようとしています。

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

列の長さが十分に大きくないために失敗します。

4

1 に答える 1

11

SQLステートメントが構文的に有効であり、正確なエラーメッセージを提供した場合に役立ちます。再フォーマットして構文を修正すると、ステートメントは次のようになります。

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

また、2KBページのシステムで実行すると、エラーメッセージは次のようになります。

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

エラーメッセージの簡単な説明を取得する標準的な方法は次のとおりですfinderr。それは言う:

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

$

'合計120バイト'は'合計少なくとも120バイト'である必要があります。その下限はInformixSEに適用されます。IDS(Informix Dynamic Server)では、下限は255バイトですが、最近のシステムでは大きくなり、ページサイズが大きくなると大きくなります。

さまざまなオプションがあります。

  • 名前がそれぞれ255文字である必要がある理由を考えることができます-それは賢明ですか(たとえば、64文字で十分です)?
  • サーバーのバージョンが十分に新しい場合(10.00以降だと思います)、より大きなページサイズのDB領域にテーブルを作成できます。

キーは最大3*255 +(20/2 + 1)= 776バイトであり、経験則では、5つの最大長のキー値+ ROWID / FRAGIDオーバーヘッド(8バイト)を格納できる必要があるためです。 1ページあたり、4KBのページサイズが必要になります。(AIXで実行していれば、おそらく問題に気付かなかったでしょう。)

また、日付の値をVARCHAR(255)に保存しないでください。DATEまたはおそらくDATETIMEYEARTO DAY(DATEのスペルの奇妙な方法-基本的な形式は異なりますが、プレーンなDATEの場合は4バイトではなく5バイトを使用します)、またはDATETIME YEAR TO SECOND(面白い方法TIMESTAMPのスペル)、または...'num0、num1、num2'フィールドも疑わしいです。数値を格納する場合は、NUMERICまたはDECIMALを使用します。ほとんどのIDSデータベースのDECIMAL(20)は、20桁の浮動小数点10進数を意味します。

追加するために編集:

また、直接の質問に答えるために、VARCHAR列の長さは最大255バイトです。LVARCHAR列は最大約32KBです。CHAR列は最大32KBです。TEXT列は最大2GBにすることができ、CLOB列はさらに大きくすることができます。行の合計の長さは約32KBに制限されています(ただし、BYTE、TEXT、BLOB、およびCLOB列は、合計32 KBの固定サイズ記述子としてカウントされます。実際のデータは行の外部に格納されます)。私が明らかにしていないバージョンの依存関係がいくつかあります-IDS10.00以降を使用している場合、これは正確です。

于 2008-10-09T18:26:44.470 に答える