문제

다음과 같은 테이블을 만들려고합니다.

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

열 길이가 충분히 크지 않아 실패합니다.

도움이 되었습니까?

해결책

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 바이트'여야합니다. 그 하위 바운드는 Informix SE에 적용됩니다. IDS (Informix Dynamic Server)에서 하단 바운드는 255 바이트이지만 최신 시스템에서는 더 크고 페이지 크기가 더 크면 더 큽니다.

다양한 옵션이 있습니다.

  • 왜 이름이 각각 255자가되어야하는지 고려할 수 있습니다.
  • 서버 버전이 최근에 충분한 경우 (10.00 이상이라고 생각합니다) 페이지 크기가 더 큰 DBSpace로 테이블을 만들 수 있습니다.

키는 최대 3*255+(20/2+1) = 776 바이트이므로 경험 법칙은 5 개의 최대 길이 키 값+Rowid/Fragid 오버 헤드 (8 바이트)를 저장할 수 있어야합니다. 페이지 당 4kb 페이지 크기가 필요합니다. (AIX에서 실행 한 적이 있다면 아마도 문제를 눈치 채지 못했을 것입니다.)

또한 Varchar (255)에 날짜 값을 저장해서는 안됩니다. 날짜 또는 아마도 일년 내내 날짜 또는 dateTime (철자 날짜의 이상한 방법 - 기본 형식은 다르지만 평범한 날짜의 경우 4 대신 디스크에서 5 바이트를 사용하거나 DateTime ~ 2 위) (재미있는 방법)를 사용해야합니다. 철자 타임 스탬프) 또는 ... 'num0, num1, num2'필드도 모호합니다. 숫자를 저장하려는 경우 숫자 또는 소수점을 사용하십시오. 대부분의 IDS 데이터베이스에서 10 진수 (20)는 20 자리 플로팅 포인트 소수점 숫자를 의미합니다.

추가하기 위해 편집 :

그리고 직접 질문에 답하기 위해 Varchar 열은 최대 255 바이트 길이 일 수 있습니다. Lvarchar 컬럼은 최대 약 32kb 일 수 있습니다. 숯 컬럼은 최대 32kb 일 수 있습니다. 텍스트 열은 최대 2GB 일 수 있으며 클로브 열은 훨씬 클 수 있습니다. 행의 총 길이는 약 32kb로 제한됩니다 (바이트, 텍스트, 블로브 및 클로브 열은 총 32kb의 고정 크기 디스크립터로 계산됩니다. 실제 데이터는 행 외부에 저장됩니다). 내가 가져 오지 않는 버전 종속성이 있습니다. IDS 10.00 이상을 사용하는 경우 정확합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top