ข้อผิดพลาด mysql 1025 (HY000): ข้อผิดพลาดในการเปลี่ยนชื่อเป็น './foo' (errorno: 150) หมายถึงอะไร


160

ฉันลองสิ่งนี้ใน mysql:

mysql> alter table region drop column country_id;

และได้รับสิ่งนี้:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

ความคิดใด ๆ สิ่งสำคัญต่างประเทศ?


@skiphoppy - คุณพยายามให้รางวัลกับคำตอบที่ได้รับไปแล้วหรือยัง? นั่นเป็นสิ่งที่อนุญาตหรือไม่? หรือกรณีของคุณแตกต่างกันซึ่งในกรณีที่คุณควรเริ่มหัวข้ออื่น?
Rick James

@RickJames ใช่มันเป็น อย่างไรก็ตาม skiphoppy ควรเพิ่มความคิดเห็นของเธอภายใต้คำตอบที่เธอเลือกเนื่องจากข้อความของ bouty จะหายไปเมื่อความโปรดปรานสิ้นสุดลง
RandomSeed

คำตอบ:


240

คุณมักจะได้รับข้อผิดพลาดนี้หากตารางของคุณใช้เอ็นจิ้น InnoDB ในกรณีนี้คุณต้องวาง foreign key จากนั้นทำการเปลี่ยนแปลงตารางและวางคอลัมน์

แต่ส่วนที่ยุ่งยากคือคุณไม่สามารถปล่อยคีย์ต่างประเทศโดยใช้ชื่อคอลัมน์ได้ แต่คุณจะต้องค้นหาชื่อที่ใช้ทำดัชนี ในการค้นหานั้นให้เลือกดังต่อไปนี้:

แสดงภูมิภาคสร้างตาราง;

สิ่งนี้จะแสดงชื่อของดัชนีให้คุณเห็นดังนี้:

region_ibfk_1คีย์CONSTRAINT ต่างประเทศ ( country_id) การอ้างอิง country( id) เมื่อลบไม่มีการดำเนินการเมื่ออัปเดตไม่มีการดำเนินการ

ตอนนี้เพียงแค่ออก:

ภูมิภาคตารางการเปลี่ยนแปลงลดลงที่สำคัญต่างประเทศ region_ibfk_1;

และในที่สุดก็เป็น:

ปรับเปลี่ยนคอลัมน์พื้นที่วางของ country_id

และคุณจะไปดี!


โปรดทราบว่าคุณยังสามารถวาง foreign key และคอลัมน์ในหนึ่ง ALTER TABLE เคียวรี
Valentin Grégoire

ดี! เราควรวางกุญแจต่างประเทศทุกอย่างจะโอเค! ขอบคุณ!
Luan D

173

แท้จริงแล้วเป็นข้อผิดพลาดของคีย์ต่างประเทศคุณสามารถค้นหาด้วยการใช้คำผิด:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

หากต้องการค้นหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ล้มเหลวคุณสามารถใช้SHOW ENGINE INNODB STATUSและค้นหาส่วนข้อผิดพลาดที่สำคัญที่สุดในต่างประเทศซึ่งมีรายละเอียดเกี่ยวกับสิ่งที่ผิด

ในกรณีของคุณเป็นไปได้มากว่าสาเหตุบางอย่างกำลังอ้างอิงคอลัมน์ country_id


2
อีกครั้ง MySQL ทำให้เข้าใจผิดอีกข้อผิดพลาดแสดง ... ขอบคุณ
e2-e4

ใน phpMyAdmin คุณสามารถค้นหาสถานะของเอ็นจิ้นได้จาก Storage Engines , InnoDB , สถานะ InnoDB
Maxence

15

คุณสามารถรับข้อผิดพลาดนี้ได้เช่นกันพยายามวางรหัสต่างประเทศที่ไม่มีอยู่ ดังนั้นเมื่อวางกุญแจต่างประเทศอยู่เสมอให้แน่ใจว่ามีอยู่จริง

หากมีคีย์ต่างประเทศอยู่และคุณยังคงได้รับข้อผิดพลาดนี้ให้ลองปฏิบัติดังนี้:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// วางกุญแจต่างประเทศที่นี่!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

นี่เป็นเคล็ดลับสำหรับฉันเสมอ :)


1
ฉันต้องการสิ่งนี้ในขณะที่เปลี่ยนเป็นชุดอักขระที่แตกต่างกันของตารางเนื่องจากข้อผิดพลาด mysql: ข้อผิดพลาด 1025 (HY000): ข้อผิดพลาดในการเปลี่ยนชื่อของ './table/#sql-14ae_81' เป็น (errno: 150)
letsjump

7

เพียงเรียกใช้คิวรีตารางแก้ไขโดยใช้ 'KEY' แทน 'KEY FOREIGN' ในคำสั่งดร็อป ฉันหวังว่ามันจะช่วยในการแก้ปัญหาและจะวางข้อ จำกัด กุญแจต่างประเทศและคุณสามารถเปลี่ยนคอลัมน์ตารางและวางตาราง

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ที่นี่ในDROP KEYแทนDROP FOREIGN KEY ,

หวังว่ามันจะช่วย

ขอบคุณ


4

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่เป็นเครื่องมือค้นหายอดนิยมอันดับแรกของทุกคนหากคุณกำลังมองหาข้อผิดพลาด 1,025

อย่างไรก็ตามมี "แฮ็ค" ที่ง่ายสำหรับการแก้ไขปัญหานี้:

ก่อนที่คุณจะดำเนินการคำสั่งของคุณก่อนอื่นคุณต้องปิดการใช้งานการตรวจสอบข้อ จำกัด ที่สำคัญต่างประเทศโดยใช้คำสั่งนี้:

SET FOREIGN_KEY_CHECKS = 0;

จากนั้นคุณสามารถดำเนินการคำสั่งของคุณ

หลังจากเสร็จสิ้นอย่าลืมเปิดใช้งานการตรวจสอบข้อ จำกัด คีย์ต่างประเทศอีกครั้งโดยใช้คำสั่งนี้:

SET FOREIGN_KEY_CHECKS = 1;

โชคดีกับความพยายามของคุณ.


มีปัญหาในการติดตั้ง octobercms บน xampp ในที่สุดสิ่งนี้ก็ช่วยได้
jahackbeth

2

ฉันมีปัญหาที่คล้ายกันหนึ่งครั้ง ฉันลบคีย์หลักออกจาก Table A แต่เมื่อฉันพยายามลบคอลัมน์ foreign key จากตาราง BI แสดงข้อผิดพลาดเดียวกันข้างต้น

คุณไม่สามารถวางกุญแจต่างประเทศโดยใช้ชื่อคอลัมน์และหลีกเลี่ยงสิ่งนี้ใน PHPMyAdmin หรือกับ MySQL ก่อนอื่นให้ลบข้อ จำกัด รหัสต่างประเทศก่อนเปลี่ยนชื่อหรือลบแอตทริบิวต์


1

ลองดูในไฟล์ข้อผิดพลาดสำหรับฐานข้อมูล mysql ของคุณ ตามBug # 26305 sql ของฉันไม่ได้ให้สาเหตุ ข้อผิดพลาดนี้มีอยู่ตั้งแต่ MySQL 4.1 ;-)


ฉันพบคำตอบของคุณยากที่จะติดตาม แต่ +1 สำหรับการเชื่อมโยงไปยังรายงานข้อผิดพลาด เห็นได้ชัดว่าตอนนี้ได้รับการแก้ไขใน MySQL v5.6.6 :)
mwfearnley

1

หากคุณใช้งานไคลเอนต์เช่น MySQL Workbench ให้คลิกขวาที่ตารางที่ต้องการลบรหัสต่างประเทศจากนั้นเลือกแท็บต่างประเทศและลบดัชนี

จากนั้นคุณสามารถเรียกใช้คิวรีแบบนี้:

alter table table_name drop foreign_key_col_name;

1

อาจมีตารางอื่นที่มีรหัสต่างประเทศอ้างอิงรหัสหลักที่คุณพยายามเปลี่ยน

หากต้องการทราบว่าตารางใดที่ทำให้เกิดข้อผิดพลาดคุณสามารถเรียกใช้SHOW ENGINE INNODB STATUSแล้วดูที่LATEST FOREIGN KEY ERRORส่วน

ใช้หมวดหมู่ SHOW CREATE TABLE เพื่อแสดงชื่อของข้อ จำกัด

ส่วนใหญ่น่าจะเป็นหมวดหมู่ _ibfk_1

ใช้ชื่อเพื่อวาง foreign key ก่อนจากนั้นจึงทำการคอลัมน์:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;


0

ฉันเดาปัญหาข้อ จำกัด ของรหัสต่างประเทศ country_id ใช้เป็น foreign key ในตารางอื่นหรือไม่?

ฉันไม่ใช่กูรู DB แต่ฉันคิดว่าฉันแก้ปัญหาเช่นนี้ (ที่มีข้อ จำกัด fk) โดยการลบ fk ทำสิ่งที่ตารางการเปลี่ยนแปลงของฉันและจากนั้นทำซ้ำสิ่งที่ fk

ฉันจะสนใจที่จะรับฟังว่าผลลัพธ์คืออะไร - บางครั้ง mysql ค่อนข้างเป็นความลับ


Mysql สามารถน่ากลัว โดยปกติแล้วดี แต่ข้อความผิดพลาดเหล่านั้นเชช หากเราได้รับคำอธิบายสั้น ๆ จากใครบางคนในสำนักงานฉันจะทิ้งมันไว้ที่นี่
เทรนตัน

0

ในกรณีของฉันฉันใช้ MySQL workbench และฉันประสบปัญหาเดียวกันในขณะที่วางคอลัมน์ของฉันลงในตาราง ฉันหาชื่อของคีย์ต่างประเทศไม่พบ ฉันทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหา:

  1. Rt คลิกที่สคีมาของคุณและเลือก 'ผู้ตรวจสอบสคีมา' สิ่งนี้จะช่วยให้คุณมีตารางคอลัมน์ดัชนีและอื่น ๆ

  2. ไปที่แท็บชื่อ 'ดัชนี' และค้นหาชื่อของคอลัมน์ใต้คอลัมน์ชื่อ 'คอลัมน์' เมื่อพบตรวจสอบชื่อของตารางสำหรับบันทึกนี้ภายใต้ชื่อคอลัมน์ 'ตาราง' หากตรงกับชื่อของตารางที่คุณต้องการให้จดชื่อของรหัสต่างประเทศจากคอลัมน์ชื่อ 'ชื่อ'

  3. ตอนนี้ดำเนินการค้นหา: แก้ไขตาราง tableNamexx DROP KEY foreignKeyName;

  4. ตอนนี้คุณสามารถดำเนินการคำสั่งแบบหล่นซึ่งจะดำเนินการประสบความสำเร็จ


0

ฉันพบข้อผิดพลาดนี้กับ MySQL 5.6 แต่ไม่มีอะไรเกี่ยวข้องกับคีย์ต่างประเทศ นี่เป็นเครื่อง Windows 7 Professional ที่ทำหน้าที่เป็นเซิร์ฟเวอร์บน LAN ขนาดเล็ก

แอปพลิเคชันไคลเอนต์กำลังทำการดำเนินการแบบแบตช์ที่สร้างตารางเติมข้อมูลภายนอกบางส่วนจากนั้นเรียกใช้แบบสอบถามที่เข้าร่วมกับตารางถาวรจากนั้นวางตาราง "ชั่วคราว" ชุดนี้ทำเช่นนี้ประมาณ 300 ครั้งและรูทีนเฉพาะนี้ทำงานสัปดาห์ในสัปดาห์เป็นเวลาหลายปีเมื่อเราได้รับข้อผิดพลาด 1025 ไม่สามารถเปลี่ยนชื่อปัญหาที่จุดสุ่มในชุด

ในกรณีของฉันแอปพลิเคชันใช้คำสั่ง DDL 4 รายการ CREATE TABLE ตามด้วย 3 CREATE INDEX ไม่มีคีย์ต่างประเทศ อย่างไรก็ตามดัชนีเพียง 2 ตัวเท่านั้นที่ถูกสร้างขึ้นจริงและไฟล์. frm ของตารางที่แท้จริงถูกเปลี่ยนชื่อ ณ จุดที่ล้มเหลว

โซลูชันของฉันคือกำจัดคำสั่ง CREATE INDEX แยกต่างหากและสร้างโดยใช้คำสั่ง CREATE TABLE ในขณะที่เขียนนี้ได้แก้ไขปัญหาสำหรับฉันและฉันช่วยคนอื่นเกาหัวเมื่อพวกเขาพบหัวข้อนี้


-2

averageRatings = FOREACH จัดกลุ่มการจัดอันดับกลุ่ม GENERATE AS movieID, AVG (ให้คะแนนการจัดอันดับ) AS avgRating, COUNT (ให้คะแนนการจัดอันดับ) AS numRatings;

หากคุณใช้คำสั่งใด ๆ ข้างต้นคุณต้องใช้กลุ่มด้วยตัวอักษรขนาดเล็ก นี่อาจช่วยแก้ปัญหาของคุณได้ อย่างน้อยก็ในสคริปต์ PIG


ฉันไม่คิดว่านี่เป็นปัญหาที่เกี่ยวข้องเขาหรือเธอกำลังตีปัญหา mysql
Zdenek Machek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.