Lỗi mysql 1025 (HY000): Lỗi khi đổi tên './foo' (errorno: 150) nghĩa là gì?


160

Tôi đã thử điều này trong mysql:

mysql> alter table region drop column country_id;

Và đã nhận được điều này:

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

Có ý kiến ​​gì không? Công cụ khóa ngoại?


@skiphoppy - Bạn đang cố gắng đưa tiền thưởng cho câu trả lời đã được đưa ra? Điều đó thậm chí có được phép không? Hoặc là trường hợp của bạn khác, trong trường hợp nào bạn nên bắt đầu một chủ đề khác?
Rick James

@RickJames Đúng vậy. Tuy nhiên, Skiphoppy nên thêm nhận xét của mình dưới câu trả lời mà cô ấy đã chọn, vì thông điệp bouty sẽ biến mất khi tiền thưởng kết thúc.
RandomSeed

Câu trả lời:


240

Bạn thường gặp lỗi này nếu các bảng của bạn sử dụng công cụ InnoDB. Trong trường hợp đó, bạn sẽ phải bỏ khóa ngoại, rồi thực hiện bảng thay đổi và thả cột.

Nhưng phần khó khăn là bạn không thể bỏ khóa ngoại bằng tên cột, mà thay vào đó, bạn sẽ phải tìm tên được sử dụng để lập chỉ mục. Để tìm thấy điều đó, đưa ra lựa chọn sau:

HIỂN THỊ TẠO BẢNG vùng;

Điều này sẽ cho bạn thấy tên của chỉ mục, một cái gì đó như thế này:

CONSTRAINT region_ibfk_1KHÓA NGOẠI TỆ ( country_id) TÀI LIỆU THAM KHẢO country( id) TRÊN XÓA KHÔNG CÓ HÀNH ĐỘNG KHI CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG

Bây giờ chỉ cần đưa ra một:

thay đổi vùng bảng thả khóa ngoại region_ibfk_1;

Và cuối cùng là:

thay đổi vùng bảng thả cột country_id;

Và bạn tốt để đi!


Lưu ý rằng bạn cũng có thể thả khóa ngoại và cột trong một truy vấn ALTER TABLE;
Valentin Grégoire

đẹp! Chúng ta nên bỏ chìa khóa nước ngoài, mọi chuyện sẽ ổn thôi! Cảm ơn!
Luân D

173

Đây thực sự là một lỗi khóa ngoại, bạn có thể tìm hiểu bằng cách sử dụng perror:

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

Để tìm hiểu thêm thông tin chi tiết về những gì không thành công, bạn có thể sử dụng SHOW ENGINE INNODB STATUSvà tìm phần L ERI NGOẠI TỪ LỚN NHẤT, nó chứa thông tin chi tiết về những gì sai.

Trong trường hợp của bạn, rất có thể nguyên nhân là một cái gì đó đang tham chiếu cột country_id.


2
Một lần nữa, một lỗi MySQL hiển thị sai khác ... Cảm ơn.
e2-e4

Trong phpMyAdmin, bạn có thể tìm thấy trạng thái của công cụ trong Storage Engines , InnoDB , InnoDB Status
Maxence

15

Bạn cũng có thể nhận được lỗi này khi cố gắng bỏ khóa ngoại không tồn tại. Vì vậy, khi thả khóa ngoại, luôn đảm bảo chúng thực sự tồn tại.

Nếu khóa ngoại tồn tại và bạn vẫn gặp lỗi này, hãy thử như sau:

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';

// Thả khóa ngoại vào đây!

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

Điều này luôn luôn là mẹo cho tôi :)


1
Tôi cần điều này trong khi chuyển sang một bộ ký tự khác của bảng, do lỗi mysql: ERROR 1025 (HY000): Lỗi khi đổi tên './table/#sql-14ae_81' thành (errno: 150)
phép

7

Chỉ cần chạy truy vấn bảng thay đổi bằng cách sử dụng 'KEY' thay vì 'FOREIGN KEY' trong câu lệnh thả. Tôi hy vọng nó sẽ giúp giải quyết vấn đề và sẽ loại bỏ ràng buộc khóa ngoại và bạn có thể thay đổi các cột trong bảng và thả bảng.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ở đây DROP KEYthay vì DROP FOREIGN KEY,

hy vọng nó sẽ giúp

Cảm ơn


4

Tôi biết, đây là một bài viết cũ, nhưng đây là bài viết đầu tiên trên công cụ tìm kiếm yêu thích của mọi người nếu bạn đang tìm kiếm lỗi 1025.

Tuy nhiên, có một "hack" dễ dàng để khắc phục vấn đề này:

Trước khi bạn thực thi (các) lệnh của mình, trước tiên bạn phải vô hiệu hóa kiểm tra ràng buộc khóa ngoài bằng lệnh này:

SET FOREIGN_KEY_CHECKS = 0;

Sau đó, bạn có thể thực hiện (các) lệnh của bạn.

Sau khi hoàn thành, đừng quên bật lại kiểm tra ràng buộc khóa ngoại, sử dụng lệnh này:

SET FOREIGN_KEY_CHECKS = 1;

Chúc may mắn với nỗ lực của bạn.


Đã gặp sự cố khi cài đặt oc / 10cm trên xampp, cuối cùng điều này cũng có ích.
jahackbeth

2

Tôi đã có một vấn đề tương tự một lần. Tôi đã xóa khóa chính khỏi BẢNG A nhưng khi tôi cố xóa cột khóa ngoại khỏi bảng BI thì lại xuất hiện lỗi tương tự.

Bạn không thể bỏ khóa ngoại bằng tên cột và bỏ qua điều này trong PHPMyAdmin hoặc với MySQL, trước tiên hãy xóa ràng buộc khóa ngoại trước khi đổi tên hoặc xóa thuộc tính.


1

Hãy xem tập tin lỗi cho cơ sở dữ liệu mysql của bạn. Theo Bug # 26305 sql của tôi không cung cấp cho bạn nguyên nhân. Lỗi này tồn tại kể từ MySQL 4.1 ;-)


Tôi thấy một số câu trả lời của bạn khó theo dõi, nhưng +1 để liên kết với báo cáo lỗi. Rõ ràng, giờ đây nó đã được sửa trong MySQL v5.6.6. :)
mwfearnley 23/8/2016

1

Nếu bạn đang sử dụng một máy khách như MySQL Workbench, nhấp chuột phải vào bảng mong muốn từ đó sẽ xóa khóa ngoại, sau đó chọn tab khóa ngoài và xóa các chỉ mục.

Sau đó, bạn có thể chạy truy vấn như thế này:

alter table table_name drop foreign_key_col_name;

1

Có lẽ có một bảng khác có khóa ngoại tham chiếu khóa chính bạn đang cố gắng thay đổi.

Để tìm ra bảng nào gây ra lỗi, bạn có thể chạy SHOW ENGINE INNODB STATUSvà sau đó xem LATEST FOREIGN KEY ERRORphần

Sử dụng các danh mục SHOW CREATE TABLE để hiển thị tên của ràng buộc.

Nhiều khả năng nó sẽ là chuyên mục_ibfk_1

Sử dụng tên để thả khóa ngoại trước và cột sau đó:

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

1

Đang làm

SET FOREIGN_KEY_CHECKS=0;

trước khi hoạt động cũng có thể làm các thủ thuật.


0

Tôi đoán vấn đề ràng buộc khóa ngoại. Có phải country_id được sử dụng làm khóa ngoại trong bảng khác không?

Tôi không phải là guru DB nhưng tôi nghĩ rằng tôi đã giải quyết một vấn đề như thế này (nơi có ràng buộc fk) bằng cách xóa fk, thực hiện công cụ thay đổi bảng của tôi và sau đó làm lại công cụ fk.

Tôi sẽ quan tâm để biết kết quả là gì - đôi khi mysql khá khó hiểu.


Mysql có thể là khủng khiếp. Tốt thường, nhưng những thông báo lỗi, sheesh. Nếu chúng tôi nhận được lời giải thích ngắn gọn từ một người nào đó trong văn phòng, tôi sẽ ném nó lên đây.
Trenton

0

Trong trường hợp của tôi, tôi đã sử dụng bàn làm việc của MySQL và tôi gặp phải vấn đề tương tự trong khi thả một trong các cột của mình vào một bảng. Tôi không thể tìm thấy tên của khóa ngoại. Tôi đã làm theo các bước sau để giải quyết vấn đề:

  1. Rt. nhấp vào lược đồ của bạn và chọn 'trình kiểm tra lược đồ'. Điều này cung cấp cho bạn các bảng, cột, chỉ mục, ect khác nhau.

  2. Chuyển đến tab có tên 'Chỉ mục' và tìm kiếm tên của cột bên dưới cột có tên 'Cột'. Khi tìm thấy, hãy kiểm tra tên của bảng cho bản ghi này dưới tên cột 'Bảng'. Nếu nó khớp với tên của bảng bạn muốn, thì hãy ghi lại tên của khóa ngoại từ cột có tên 'Tên'.

  3. Bây giờ thực hiện truy vấn: ALTER bảng tableNamexx DROP KEY ForeignKeyName;

  4. Bây giờ bạn có thể thực thi câu lệnh thả sẽ thực thi thành công.


0

Tôi đã gặp lỗi này với MySQL 5.6 nhưng nó không liên quan gì đến khóa ngoại. Đây là trên một máy Windows 7 Professional hoạt động như một máy chủ trên một mạng LAN nhỏ.

Ứng dụng khách đang thực hiện một thao tác hàng loạt tạo ra một bảng điền vào nó với một số dữ liệu ngoài sau đó chạy một truy vấn kết hợp với các bảng cố định sau đó bỏ bảng "tạm thời". Lô này thực hiện việc này khoảng 300 lần và thói quen đặc biệt này đã diễn ra hàng tuần trong vài năm khi đột nhiên chúng tôi gặp phải Lỗi 1025 Không thể đổi tên sự cố tại một điểm ngẫu nhiên trong lô.

Trong trường hợp của tôi, ứng dụng đã sử dụng 4 câu lệnh DDL, CREATE TABLE theo sau là 3 CREATE INDEX, không có khóa ngoại. Tuy nhiên, chỉ có 2 trong số các chỉ mục thực sự được tạo và tệp .frm thực tế đã được đổi tên, tại điểm không thành công.

Giải pháp của tôi là loại bỏ các câu lệnh CREATE INDEX riêng biệt và tạo chúng bằng cách sử dụng câu lệnh CREATE TABLE. Điều này tại thời điểm viết đã giải quyết vấn đề cho tôi và tôi giúp người khác gãi đầu khi họ tìm thấy chủ đề này.


-2

AverageRatings = FOREACH groupedRatings TẠO nhóm NHƯ phimID, AVG (xếp hạng.rating) NHƯ avgRating, COUNT (xếp hạng.rating) AS numRatings;

Nếu bạn đang sử dụng bất kỳ lệnh nào như trên, bạn phải sử dụng nhóm bằng chữ nhỏ. Điều này có thể giải quyết vấn đề của bạn nó đã giải quyết của tôi. Ít nhất là trong kịch bản PIG.


Tôi không nghĩ đây là vấn đề liên quan, anh ấy hoặc cô ấy đang gặp vấn đề về mysql
Zdenek Machek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.