개발자
syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[CONSTRAINT fk_name] FOREIGN KEY(name) REFERENCES uesr_into(name) ON UPD' at line 5 CREATE TABLE a_check( id MEDIUMINT AUTO_INCREMENT PRIMARY KEY, name MEDIUMTEXT not null, age MEDIUMINT not null, [CONSTRAINT fk_name] FOREIGN KEY(name) REFERENCES uesr_into(name) ON UPDATA CASCADE ); 무슨 에러에요? 데이터가 있어야 한다는 걸까요?
답변 1
오류 메세지 보는 법을 먼저 알려드릴게요. syntax -> syntax.. 그러니까 문법 오류입니다. CREATE 구문이 문법적으로 올바르지 않은 거죠. near '[CONSTRAINT fk_name] FOREIGN KEY(name) REFERENCES uesr_into(name) ON UPD' at line 5 -> near 바로 다음에 나오는 부분부터 틀렸다는 거고 이 부분에 어떤 문제가 있는지 살펴 보면 됩니다. (원인) 대괄호가 문제입니다. 혹시 SQL Server의 개체 한정자가 대괄호여서 쓰셨는지 모르겠는데.. 그렇다고 해도 FK의 이름만 감싸야 합니다. 무엇보다 MySQL에서 개체 한정자는 대괄호가 아니라 백틱 (`) 이니, 이것도 참고하세요. (해결)
1CREATE TABLE `a_check` (
2 `id` MEDIUMINT AUTO_INCREMENT PRIMARY KEY,
3 `name` MEDIUMTEXT not null,
4 `age` MEDIUMINT not null,
5 CONSTRAINT `fk_name` FOREIGN KEY(`name`)
6 REFERENCES `uesr_into`(`name`) ON UPDATA CASCADE
7);
김도열
DB Designer & SQLer • 2023년 09월 21일
설계 관점에서 첨언하고 싶은 내용이 있습니다. 1. 데이터 유형 mediumtext는 최대 16MB까지 저장할 수 있는 BLOB입니다. name 컬럼에 이 유형을 사용하셨는데, 통상 name이라는 이름으로 추측하건데 이렇게 큰 문자열을 저장할 일은 없어 보입니다. varchar를 사용하고 실제로 입력할 문자열의 최대 길이를 설정하는 것이 관례입니다. age 컬럼에 사용한 mediumint는 3Byte를 차지하는 정수입니다. 나이를 기록한다면 1Byte (0 ~ 255)로 충분하겠죠. tinyint UNSIGNED를 추천합니다. id 컬럼에 사용한 mediumint가 현재 SIGNED라서 음수 영역을 허용합니다. 하지만 auto_increment 속성을 가졌기 때문에 1부터 시작하고 0이하의 값이 들어갈 일이 없겠죠. 이런 경우 UNSIGNED를 사용하는 것이 바람직합니다. 실수로 음수가 들어가지 않기도 하고 무엇보다 사용할 수 있는 정수 범위가 SIGNED에 비해 2배가 되기 때문입니다. 2. CASCADE 이건 설계자에 따라 다르지만 저의 현업 경험을 기준으로하면 CASCADE는 득보다 실이 많습니다. 사용하지 않고 코드에서 직접 제어하는 것을 추천드립니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 09월 19일
이 스크립트에는 몇 가지 문제가 있습니다. 1. `uesr_into`라는 테이블은 존재하는 건가요? 만약 아니라면, 해당 에러 메시지는 이 테이블의 부재를 지적하고 있을 가능성이 큽니다. 2. `CONSTRAINT fk_name`를 정의할 때 꺾쇠괄호 `[ ]`를 사용하지 않아야 합니다. 꺾쇠괄호는 MySQL에서 유효한 구문이 아닙니다. 3. 외래키 (FOREIGN KEY) 열과 참조 열은 반드시 동일한 데이터 타입을 가져야 합니다. 여기서 `name` 필드가 MEDIUMTEXT로 선언되어 있는데, 일반적으로 외래키로 TEXT 데이터 타입은 사용되지 않습니다. INT 등 다른 데이터 타입을 고려해보세요. 4. 마지막으로, `ON UPDATA CASCADE`부분의 UPDATA는 오타입니다. 올바른 키워드는 `ON UPDATE CASCADE`입니다. 위 사항들을 수정하고 나면 다음과 같은 식으로 스크립트를 작성할 수 있습니다: ```sql CREATE TABLE a_check( id MEDIUMINT AUTO_INCREMENT PRIMARY KEY, name MEDIUMINT NOT NULL, age MEDIUMINT NOT NULL, CONSTRAINT fk_name FOREIGN KEY(name) REFERENCES user_info(name) ON UPDATE CASCADE ); ``` 여기서 `user_info`는 `name` 열의 참조 원이 되는 테이블 이름입니다. 그리고 이 또한 `name`열은 MEDIUMINT 데이터 타입을 가져야합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!