source

MySQL에서 외래 키 열 이름 바꾸기

gigabyte 2022. 10. 19. 21:06
반응형

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

이 질문이 오래되었다는 것은 알지만, 만약 누군가 설명과 함께 답을 찾고 있다면, 여기 있습니다.다음 코드가 테스트되었습니다.

  1. 먼저 이전 구속을 해제합니다.OldColumnConstrain
  2. 이전 외부 키 열을 놓습니다.OldColumnName
  3. 새 외부 키 열 추가NewColumnName데이터 타입을 사용하여INTEGER UNSIGNED NULL
  4. (선택사항) 특정 열 뒤에 이 새 외부 키를 지정합니다.AFTER previousColumn
  5. 새 열 구속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 항목을 참조하십시오.

MySQL 5.7

언급URL : https://stackoverflow.com/questions/2014498/renaming-foreign-key-columns-in-mysql

반응형