2017-09-13 4 views
0

나는 두 개의 테이블이 있습니다MariaDB 또는 MySQL에서 텍스트 유형의 외래 키를 만들려면 어떻게해야합니까?

CREATE TABLE first_table(
my_id TEXT(6) NOT NULL, 
content VARCHAR(30) NOT NULL, 
PRIMARY KEY(my_id(6)) 
) Engine=InnoDB charset utf8mb4 collate utf8mb4_general_ci; 

CREATE TABLE second_table(
another_id TEXT(6) NOT NULL, 
my_id TEXT(6) NOT NULL, 
another_content VARCHAR(30) NOT NULL, 
PRIMARY KEY(another_id(6)) 
) Engine=InnoDB charset utf8mb4 collate utf8mb4_general_ci; 

그러나 두 번째 테이블에서 내가 첫 번째 테이블을 참조하는 외래 키를 만들 수 없습니다를 먼저 나는이 시도했다 :

ALTER TABLE second_table 
ADD FOREIGN KEY (my_id) 
REFERENCES first_table(my_id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

을 그리고이있어 오류 :

: 그래서

ERROR 1170 (42000): BLOB/TEXT column 'my_id' used in key specification without a key length 
MariaDB [base_ventas]> 

,이 같은 키 길이를 지정하려

그리고이 오류가 발생했습니다 :

ERROR 1005 (HY000): Can't create table `base_ventas`.`#sql-1a08_23c` 
(errno: 150 "Foreign key constraint is incorrectly formed") 

이 숫자 ID가 발생하지 않습니다하지만 난 문자열 형식 ID, 그것을 할 수있는, 또는 내가 뭔가를 놓친 거지가 필요?

+1

여기 '텍스트 (6)'의 요점은 무엇입니까? id 값에 외래 키를 사용하면 정말 나쁜 계획입니다. – tadman

+0

@tadman 나는 대학에 있고 DB 교수는 구조를 만들었지 만 지금은 그것을 구현하려고하고있다. 나의 선택은 숫자 id mediumint 또는 int 일 수도있다 – Alcides

+1

이 스키마는 너무 단순하다. 레벨. 식별자에 'TEXT'를 사용하면 모든 정상적인 코드 검토에서 자동 실패가 발생합니다. 이것이 숫자라면,'INT'를 사용하고, 그렇지 않으면'VARCHAR (6)'을 사용하십시오. – tadman

답변

1

불편을 끼쳐 드려 죄송합니다. MySql Documentation에 따르면

는 :

Index prefixes on foreign key columns are not supported. One consequence of this is that BLOB and TEXT columns cannot be included in a foreign key because indexes on those columns must always include a prefix length.

그리고 MariaDB Documentation :

당신이 정말로 숫자 키가 필요한 경우

The columns in the child table must be an index, or the leftmost part of an index. Index prefixes are not supported (thus, TEXT and BLOB columns cannot be used as foreign keys)

대신 char 또는 VARCHAR 같은 것을 사용하는 것이 좋습니다. 가장 쉽고, 가장 일반적이고, 가장 일반적인 방법은 INT와 같은 숫자 키를 사용하는 것입니다.

+1

필자는 의심의 여지가있다. 대학의 교수는 항상 제품에 대해 "pro-001"또는 사용자에 대해 "usr-001"과 같은 숫자가 아닌 ID를 사용하지만, int를 사용하는 것이 자동 증감, 내 교수는 데이터를 더 읽기 쉽게 만들려고 노력하지만 성능 저하를 고려할 때, 비 분산 시스템에서 생산 과정에서 그녀의 규칙을 따라야합니까? – Alcides

+1

"pro-001"이 좋습니다. 그러나 진정한 고정 된 길이라면'CHAR (7), 또는'VARCHAR (22)'(또는 '정당한 최대 길이')로 선언되어야합니다. 'TEXT'는 작동하지 않습니다. 'INDEX (foo (6))'는 작동하지 않습니다. –

+0

@RickJames, 그것은 완전히 괜찮은가요? 아니면 다소 생산에 좋지 않습니까? 필자는 영숫자 GUI가 분산 데이터베이스를 사용하는 시스템에서 사용되는 기법을 사용하고 있지만 분산되지 않은 데이터베이스 (예 : 소규모 회사)에서는이 문제를 방지해야하는지, 아니면 전혀 문제가되지 않는지 알고 싶습니다. ? – Alcides