ฉันลองสิ่งนี้ใน 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)
ความคิดใด ๆ สิ่งสำคัญต่างประเทศ?
ฉันลองสิ่งนี้ใน 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)
ความคิดใด ๆ สิ่งสำคัญต่างประเทศ?
คำตอบ:
คุณมักจะได้รับข้อผิดพลาดนี้หากตารางของคุณใช้เอ็นจิ้น InnoDB ในกรณีนี้คุณต้องวาง foreign key จากนั้นทำการเปลี่ยนแปลงตารางและวางคอลัมน์
แต่ส่วนที่ยุ่งยากคือคุณไม่สามารถปล่อยคีย์ต่างประเทศโดยใช้ชื่อคอลัมน์ได้ แต่คุณจะต้องค้นหาชื่อที่ใช้ทำดัชนี ในการค้นหานั้นให้เลือกดังต่อไปนี้:
แสดงภูมิภาคสร้างตาราง;
สิ่งนี้จะแสดงชื่อของดัชนีให้คุณเห็นดังนี้:
region_ibfk_1
คีย์CONSTRAINT ต่างประเทศ (country_id
) การอ้างอิงcountry
(id
) เมื่อลบไม่มีการดำเนินการเมื่ออัปเดตไม่มีการดำเนินการ
ตอนนี้เพียงแค่ออก:
ภูมิภาคตารางการเปลี่ยนแปลงลดลงที่สำคัญต่างประเทศ
region_ibfk_1
;
และในที่สุดก็เป็น:
ปรับเปลี่ยนคอลัมน์พื้นที่วางของ country_id
และคุณจะไปดี!
แท้จริงแล้วเป็นข้อผิดพลาดของคีย์ต่างประเทศคุณสามารถค้นหาด้วยการใช้คำผิด:
shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed
หากต้องการค้นหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ล้มเหลวคุณสามารถใช้SHOW ENGINE INNODB STATUS
และค้นหาส่วนข้อผิดพลาดที่สำคัญที่สุดในต่างประเทศซึ่งมีรายละเอียดเกี่ยวกับสิ่งที่ผิด
ในกรณีของคุณเป็นไปได้มากว่าสาเหตุบางอย่างกำลังอ้างอิงคอลัมน์ country_id
คุณสามารถรับข้อผิดพลาดนี้ได้เช่นกันพยายามวางรหัสต่างประเทศที่ไม่มีอยู่ ดังนั้นเมื่อวางกุญแจต่างประเทศอยู่เสมอให้แน่ใจว่ามีอยู่จริง
หากมีคีย์ต่างประเทศอยู่และคุณยังคงได้รับข้อผิดพลาดนี้ให้ลองปฏิบัติดังนี้:
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;
นี่เป็นเคล็ดลับสำหรับฉันเสมอ :)
เพียงเรียกใช้คิวรีตารางแก้ไขโดยใช้ 'KEY' แทน 'KEY FOREIGN' ในคำสั่งดร็อป ฉันหวังว่ามันจะช่วยในการแก้ปัญหาและจะวางข้อ จำกัด กุญแจต่างประเทศและคุณสามารถเปลี่ยนคอลัมน์ตารางและวางตาราง
ALTER TABLE slide_image_sub DROP KEY FK_slide_image_sub;
ที่นี่ในDROP KEY
แทนDROP FOREIGN KEY
,
หวังว่ามันจะช่วย
ขอบคุณ
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่เป็นเครื่องมือค้นหายอดนิยมอันดับแรกของทุกคนหากคุณกำลังมองหาข้อผิดพลาด 1,025
อย่างไรก็ตามมี "แฮ็ค" ที่ง่ายสำหรับการแก้ไขปัญหานี้:
ก่อนที่คุณจะดำเนินการคำสั่งของคุณก่อนอื่นคุณต้องปิดการใช้งานการตรวจสอบข้อ จำกัด ที่สำคัญต่างประเทศโดยใช้คำสั่งนี้:
SET FOREIGN_KEY_CHECKS = 0;
จากนั้นคุณสามารถดำเนินการคำสั่งของคุณ
หลังจากเสร็จสิ้นอย่าลืมเปิดใช้งานการตรวจสอบข้อ จำกัด คีย์ต่างประเทศอีกครั้งโดยใช้คำสั่งนี้:
SET FOREIGN_KEY_CHECKS = 1;
โชคดีกับความพยายามของคุณ.
ฉันมีปัญหาที่คล้ายกันหนึ่งครั้ง ฉันลบคีย์หลักออกจาก Table A แต่เมื่อฉันพยายามลบคอลัมน์ foreign key จากตาราง BI แสดงข้อผิดพลาดเดียวกันข้างต้น
คุณไม่สามารถวางกุญแจต่างประเทศโดยใช้ชื่อคอลัมน์และหลีกเลี่ยงสิ่งนี้ใน PHPMyAdmin หรือกับ MySQL ก่อนอื่นให้ลบข้อ จำกัด รหัสต่างประเทศก่อนเปลี่ยนชื่อหรือลบแอตทริบิวต์
ลองดูในไฟล์ข้อผิดพลาดสำหรับฐานข้อมูล mysql ของคุณ ตามBug # 26305 sql ของฉันไม่ได้ให้สาเหตุ ข้อผิดพลาดนี้มีอยู่ตั้งแต่ MySQL 4.1 ;-)
หากคุณใช้งานไคลเอนต์เช่น MySQL Workbench ให้คลิกขวาที่ตารางที่ต้องการลบรหัสต่างประเทศจากนั้นเลือกแท็บต่างประเทศและลบดัชนี
จากนั้นคุณสามารถเรียกใช้คิวรีแบบนี้:
alter table table_name drop foreign_key_col_name;
อาจมีตารางอื่นที่มีรหัสต่างประเทศอ้างอิงรหัสหลักที่คุณพยายามเปลี่ยน
หากต้องการทราบว่าตารางใดที่ทำให้เกิดข้อผิดพลาดคุณสามารถเรียกใช้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;
การทำ
SET FOREIGN_KEY_CHECKS=0;
ก่อนที่ Operation จะสามารถทำการหลอกลวงได้
ฉันเดาปัญหาข้อ จำกัด ของรหัสต่างประเทศ country_id ใช้เป็น foreign key ในตารางอื่นหรือไม่?
ฉันไม่ใช่กูรู DB แต่ฉันคิดว่าฉันแก้ปัญหาเช่นนี้ (ที่มีข้อ จำกัด fk) โดยการลบ fk ทำสิ่งที่ตารางการเปลี่ยนแปลงของฉันและจากนั้นทำซ้ำสิ่งที่ fk
ฉันจะสนใจที่จะรับฟังว่าผลลัพธ์คืออะไร - บางครั้ง mysql ค่อนข้างเป็นความลับ
ในกรณีของฉันฉันใช้ MySQL workbench และฉันประสบปัญหาเดียวกันในขณะที่วางคอลัมน์ของฉันลงในตาราง ฉันหาชื่อของคีย์ต่างประเทศไม่พบ ฉันทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหา:
Rt คลิกที่สคีมาของคุณและเลือก 'ผู้ตรวจสอบสคีมา' สิ่งนี้จะช่วยให้คุณมีตารางคอลัมน์ดัชนีและอื่น ๆ
ไปที่แท็บชื่อ 'ดัชนี' และค้นหาชื่อของคอลัมน์ใต้คอลัมน์ชื่อ 'คอลัมน์' เมื่อพบตรวจสอบชื่อของตารางสำหรับบันทึกนี้ภายใต้ชื่อคอลัมน์ 'ตาราง' หากตรงกับชื่อของตารางที่คุณต้องการให้จดชื่อของรหัสต่างประเทศจากคอลัมน์ชื่อ 'ชื่อ'
ตอนนี้ดำเนินการค้นหา: แก้ไขตาราง tableNamexx DROP KEY foreignKeyName;
ตอนนี้คุณสามารถดำเนินการคำสั่งแบบหล่นซึ่งจะดำเนินการประสบความสำเร็จ
ฉันพบข้อผิดพลาดนี้กับ MySQL 5.6 แต่ไม่มีอะไรเกี่ยวข้องกับคีย์ต่างประเทศ นี่เป็นเครื่อง Windows 7 Professional ที่ทำหน้าที่เป็นเซิร์ฟเวอร์บน LAN ขนาดเล็ก
แอปพลิเคชันไคลเอนต์กำลังทำการดำเนินการแบบแบตช์ที่สร้างตารางเติมข้อมูลภายนอกบางส่วนจากนั้นเรียกใช้แบบสอบถามที่เข้าร่วมกับตารางถาวรจากนั้นวางตาราง "ชั่วคราว" ชุดนี้ทำเช่นนี้ประมาณ 300 ครั้งและรูทีนเฉพาะนี้ทำงานสัปดาห์ในสัปดาห์เป็นเวลาหลายปีเมื่อเราได้รับข้อผิดพลาด 1025 ไม่สามารถเปลี่ยนชื่อปัญหาที่จุดสุ่มในชุด
ในกรณีของฉันแอปพลิเคชันใช้คำสั่ง DDL 4 รายการ CREATE TABLE ตามด้วย 3 CREATE INDEX ไม่มีคีย์ต่างประเทศ อย่างไรก็ตามดัชนีเพียง 2 ตัวเท่านั้นที่ถูกสร้างขึ้นจริงและไฟล์. frm ของตารางที่แท้จริงถูกเปลี่ยนชื่อ ณ จุดที่ล้มเหลว
โซลูชันของฉันคือกำจัดคำสั่ง CREATE INDEX แยกต่างหากและสร้างโดยใช้คำสั่ง CREATE TABLE ในขณะที่เขียนนี้ได้แก้ไขปัญหาสำหรับฉันและฉันช่วยคนอื่นเกาหัวเมื่อพวกเขาพบหัวข้อนี้
averageRatings = FOREACH จัดกลุ่มการจัดอันดับกลุ่ม GENERATE AS movieID, AVG (ให้คะแนนการจัดอันดับ) AS avgRating, COUNT (ให้คะแนนการจัดอันดับ) AS numRatings;
หากคุณใช้คำสั่งใด ๆ ข้างต้นคุณต้องใช้กลุ่มด้วยตัวอักษรขนาดเล็ก นี่อาจช่วยแก้ปัญหาของคุณได้ อย่างน้อยก็ในสคริปต์ PIG