programing

mysql/sysqladb - 테이블 열 인덱스 생성이 작동하지 않습니다.

sourcetip 2022. 10. 8. 16:35
반응형

mysql/sysqladb - 테이블 열 인덱스 생성이 작동하지 않습니다.

그래서 다음과 같이 테이블을 작성하려고 합니다.

CREATE TABLE company
  (
    id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name TEXT UNIQUE NOT NULL,

    INDEX(name(20))
  );

다음과 같은 오류가 발생합니다.

ERROR 1170 (42000): BLOB/TEXT column 'name' used in key specification without a key length

이 가이드에서는 https://dev.mysql.com/doc/refman/5.5/en/column-indexes.html에 기재되어 있기 때문에, 왜 동작하지 않는지를 알 수 없습니다.

당신은 잘못된 선에 집중하고 있어요.

name TEXT UNIQUE NOT NULL,

의 인덱스BLOB그리고.TEXT컬럼은 프레픽스인덱스여야 합니다.따라서 prefix인덱스를 지정할 수 없습니다.UNIQUE에 대한 제약TEXT기둥.또한 이러한 열을 기본 키 또는 외부 키 제약 조건의 일부로 만들 수 없습니다.

일반적인 두 가지 솔루션:

  1. 사용 안 함TEXT열, 사용VARCHAR.

  2. 긴 열을 고유하게 만들어야 할 경우 유형의 두 번째 열을 만듭니다.CHAR,COLLATE ascii_bin고유한 제약조건을 추가하여 선택한 암호화 해시(md5, sha)의 base64 표현에 맞게 크기를 조정합니다.사용하다BEFORE INSERT그리고.BEFORE UPDATE트리거: 이 컬럼에 긴 컬럼의 해시를 강제로 포함시킴으로써 간접적으로 일의성을 적용합니다.data 타입CHAR모든 해시의 길이가 같기 때문입니다.ascii_bin이것은 base64에 가장 적합한 조합이기 때문입니다.왜 Base64죠?읽기 쉽도록 스토리지 공간을 절충하여 24자를 사용하여 md5 해시를 저장합니다.md5 해시는 스토리지 공간 측면에서 바이너리(md5의 경우 16자, 효율) 인코딩과 16진수(md5의 경우 32자, 비효율) 인코딩의 중간 정도입니다.

오류를 발견했습니다.특성 이름의 길이를 지정하지 않았습니다.TEXT 대신 varchar(length)를 사용합니다.여기서 length는 숫자입니다.

따라서 최대 50글자의 이름을 원하는 경우 코드는 다음과 같습니다.

테이블 회사 생성(ID INT 서명되지 않은 기본 키가 NULL AUTO_Increment가 아님,
name varchar(50) UNIQURE는 NULL이 아닙니다.
색인(이름(20))
);

varchar()에는 임의의 값을 지정할 수 있지만 정수여야 합니다.

언급URL : https://stackoverflow.com/questions/45625421/mysql-mariadb-create-table-column-index-not-working

반응형