Công cụ lưu trữ bảng cho <TABLE> không có tùy chọn này theo thứ tự theo truy vấn (ERROR 1031)


80

Công cụ lưu trữ bảng cho <TABLE> không có tùy chọn này.

Đây là lỗi do MySQL trả về trên một order bytruy vấn. Loại cột là varchar(2000).

Truy vấn:

select * from `dbo.table_1` order by textT;

Đã trả lại lỗi:

ERROR 1031 (HY000): Công cụ lưu trữ bảng cho 'dbo.table_1' không có tùy chọn này.

Lý do tại sao điều này xảy ra? Và tôi có thể sửa nó như thế nào?


sử dụng dấu nền riêng biệt cho cả tên cơ sở dữ liệu dbovà tên bảngtable_1
Ravinder Reddy

tuyên bố sẽ trông như thế nàoselect * from `dbo`.`table_1` order by textT
Ravinder Reddy

Có thể là một vấn đề củamax_length_for_sort_data
Abhik Chakraborty


2
Bạn đã để lại ba thông tin quan trọng và không có người bình luận nào yêu cầu chúng. - Phiên bản MySQL nào? ĐỘNG CƠ lưu trữ nào? Cung cấp SHOW CREATE TABLE table_1.
Rick James

Câu trả lời:


172

Sự cố này dường như xảy ra khi bạn nhập định nghĩa bảng đã được tạo bằng MyISAM nhưng sau đó được chuyển sang InnoDB; các ROW_FORMATtùy chọn kết quả dường như không hợp lệ.

Nếu bạn đang cố nhập cơ sở dữ liệu đã xuất và gặp sự cố này, bạn chỉ cần tìm kiếm và thay thế ROW_FORMAT=FIXEDmà không cần làm gì.

Tôi đã sử dụng những điều sau để thực hiện rất nhanh chóng:

sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql

Vấn đề đã được giải quyết! Cảm ơn jbrahy đã chỉ ra rằng ROW_FORMAT là vấn đề.

CHỈNH SỬA: Đã cập nhật để hoạt động cho nhiều nền tảng hơn theo đề xuất của @ seven


Điều này đã hiệu quả với tôi, tôi đã bị chặn nhập từ tệp kết xuất và bây giờ nó nhập.
blackwood

nhanh gọn lẹ! đã cứu tôi
Tim Kretschmer

2
@haagsma đề xuất chỉnh sửa cho "-ie" thay vì chỉ sed -e. -ie hoạt động trên cả phiên bản GNU và BSD của sed. Tôi là os osx và -i hoạt động khác nhau)sed -ie 's/ROW_FORMAT=FIXED//g' backup.sql
bảy

3
Nếu @jbrahy chỉ ra vấn đề, anh ấy có nên được trao câu trả lời không? Có vẻ kỳ lạ khi anh ấy có 4 điểm và bạn có 32 khi anh ấy là câu trả lời chính xác.
Johnny 3653925,

1
Theo báo cáo lỗi này , FIXEDđược âm thầm thay đổi thành COMPACTtrong MySQL 5.6 trở về trước. Điều đó dường như cho thấy rằng đó sed -ie 's/ROW_FORMAT=FIXED/ROW_FORMAT=COMPACT/g' backup.sqlsẽ là một giải pháp "an toàn hơn" trong điều kiện duy trì cùng một hành vi.
Steen Schütt

11

Tôi gặp lỗi tương tự khi nhập định nghĩa bảng là InnoDB với ROW_FORMAT = DYNAMIC trong đó. Bảng được tạo bằng công cụ MyISAM nhưng sau đó tôi đã chuyển nó sang InnoDB. Khi tôi xóa ROW_FORMAT = DYNAMIC khỏi câu lệnh tạo bảng và tạo lại bảng, nó hoạt động tốt. Giải pháp của tôi cho vấn đề của bạn sẽ là điều này.

show create table `dbo.table_1`;

sau đó lấy đầu ra từ lệnh đó và xóa ROW_FORMAT = DYNAMIC, sau đó đổi tên bảng thành dbo.table_1_old

rename table `dbo.table_1` to `dbo.table_1_old`;

Sau đó thực hiện câu lệnh tạo bảng từ bước đầu tiên, tức là

-- don't use this create as there are missing columns use yours
create table `dbo.table_1` (textT VARCHAR(255)); 

Sau đó, tạo lại bảng của bạn với dữ liệu cũ.

insert into `dbo.table_1` select * from `dbo.table_1_old`;

Sau đó, bạn sẽ có thể thực thi SQL gốc của mình

select * from `dbo.table_1` order by textT;

10

Bạn cũng có thể thử điều này:

ALTER TABLE `dbo.table_1` ROW_FORMAT = DEFAULT ;

Cảm ơn bạn, điều này đã làm việc hoàn hảo cho tôi và giúp tôi không phải xây dựng lại nhiều bảng innodb đầy khóa ngoại.
Ian

2

Sự cố này dường như xảy ra khi bạn nhập định nghĩa bảng vào MySQL 5.7 đã được tạo bằng MySQL 5.6 trở về trước. Lỗi tương tự có thể tạo rab theo tùy chọn KEY_BUFFER_SIZE = 8192 và các kích thước tương tự được xác định theo byte cho INNODB ENGINE. Tôi đã gặp lỗi này khi nhập cơ sở từ sql-dump. Quyết định: sed -ie 's / KEY_BLOCK_SIZE = 16384 // g' my-file-sql_dump.sql


1

Tôi đang gặp phải sự cố này và tệp sao lưu của tôi là tệp được mã hóa .zsql. Vì vậy, tôi đã sửa đổi my.cnf bằng cách thêm innodb_strict_mode = off. Nó hoạt động tốt

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.