MySQL에서 외래 키 열 이름 바꾸기
MySQL(5.1.31, InnoDB)에서 외래키인 컬럼의 이름을 다른 테이블로 바꾸려고 합니다.
처음에는 Django-South를 사용하려고 했지만 알려진 문제가 발생했습니다.
http://south.aeracode.org/ticket/243
Operation Error: (1025, ".xx/#sql-bf_4d"에서 ".xxx/cave_event"로의 이름 변경 오류"(errno: 150)
그리고.
'.xx/#sql-bf_4b'의 이름을 '.xx/cave_event'로 변경하는 중 오류 발생(errno: 150)
이 에러 150은, 확실히 외부 키의 제약에 관련하고 있습니다.예를 들어,
mysql 오류 1025(HY000)란 무엇입니까?'.foo'(errorno: 150)의 이름 변경 중 오류가 발생했습니까?
http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained/
이제 raw SQL에서 이름을 바꾸려고 합니다.먼저 외부 키를 삭제하고 이름을 변경한 다음 다시 외부 키를 추가해야 할 것 같습니다.그렇게 들리나요?꽤 혼란스럽고 번거로운 것 같은데 더 좋은 방법이 있을까요?
어떤 도움이라도 주시면 감사하겠습니다!
AFIK는 제약조건을 삭제하고 이름을 변경한 후 제약조건을 다시 추가하는 유일한 방법입니다.백업 먼저!
구문을 찾는 사용자가 있는 경우 다음과 같습니다.
alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`;
alter table customer_account add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
다음은 일반 키의 SQL 구문입니다.
ALTER TABLE `thetable`
DROP KEY `oldkey`,
ADD KEY `newkey` (`tablefield`);
@Dewey의 답변에 따라 Hibernate에 의해 생성된 FK의 이름을 유용한 방법으로 변경하는 작은 스크립트를 소개합니다.("FK__" + table name + "__" + referenced table name)
.
SELECT CONCAT(
"alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n",
"alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n",
"alter table ", TABLE_NAME, " add key FK__", table_name, "__",
referenced_table_name, " (", column_name, ");\n",
"alter table ", TABLE_NAME, " add constraint FK__", table_name, "__",
referenced_table_name , " foreign key (", column_name, ") ",
"references ", referenced_table_name,
"(", referenced_column_name, ");"
) AS runMe
FROM
information_schema.key_column_usage
WHERE
TABLE_SCHEMA='myschemaname'
AND
constraint_name like 'FK_%';
출력:
alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers add key FK__visitor_browsers__websites (website);
alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id);
다음 쿼리는 올바른 구문을 자동으로 작성합니다.반환된 각 행을 실행하면 모든 FKEY가 사라집니다.
그 반대(더하기)는 당신을 위한 연습으로 남겨두겠습니다.
SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key `", CONSTRAINT_NAME,"`; ") AS runMe
FROM information_schema.key_column_usage
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME';
03 2022
이 질문이 오래되었다는 것은 알지만, 만약 누군가 설명과 함께 답을 찾고 있다면, 여기 있습니다.다음 코드가 테스트되었습니다.
- 먼저 이전 구속을 해제합니다.
OldColumnConstrain
- 이전 외부 키 열을 놓습니다.
OldColumnName
- 새 외부 키 열 추가
NewColumnName
데이터 타입을 사용하여INTEGER UNSIGNED NULL
- (선택사항) 특정 열 뒤에 이 새 외부 키를 지정합니다.
AFTER previousColumn
- 새 열 구속
newColumnConstrain
참조표와 함께t1
ALTER TABLE t1
DROP FOREIGN KEY OldColumnConstrain,
DROP COLUMN OldColumnName,
ADD NewColumnName INTEGER UNSIGNED NULL AFTER previousColumn,
ADD CONSTRAINT newColumnConstrain FOREIGN KEY (NewColumnName) REFERENCES t2(id);
중요한
위의 쿼리를 실행하면 이전 열의 이름이 새 열로 변경됩니다(정확히 이름을 바꾸지는 않지만 열을 삭제하고 추가). 그러나 WATCHOUT은 해당 열 데이터가 손실되고 다음 열로 대체됩니다.NULL
.
실제로 fk 이름을 바꿀 수 있나요?
아닌 것 같아요.해결책을 찾으면 이 답변을 업데이트하겠습니다.
이 답변은 https://stackoverflow.com/a/2014519/5413283를 참조하십시오.https://stackoverflow.com/a/2014519/5413283
이 작업은 GUI 도구를 사용하면 간단해집니다.IntelliJ IDEA Database 툴을 사용하여 ID 컬럼의 이름을 변경하려고 했는데, 매우 효과가 있었습니다!테이블이나 열의 이름을 바꿀 때 외부 키에 대해 신경 쓸 필요가 없습니다.
자세한 내용은 IntelliJ IDEA Help | Renameing 항목을 참조하십시오.
언급URL : https://stackoverflow.com/questions/2014498/renaming-foreign-key-columns-in-mysql
'source' 카테고리의 다른 글
stdin은 어떻게 읽어요? (0) | 2022.10.19 |
---|---|
Python에서 긴 줄을 여러 줄로 나눌 수 있습니까? (0) | 2022.10.19 |
Vue.js 2: 조건부 렌더링이 작동하지 않음 (0) | 2022.10.19 |
라라벨의 장인 설치 방법은? (0) | 2022.10.19 |
도커 컴포지트 영속적인 데이터 문제 (0) | 2022.10.02 |