Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:Lỗi SQL:1140, SQLState:42000

Truy vấn sau không hợp lệ với ONLY_FULL_GROUP_BY đã được kích hoạt. Đầu tiên không hợp lệ vì tên trong danh sách chọn không có tên trong GROUP BY mệnh đề

mysql> SELECT name, MAX(age) FROM t;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)

không có cột GROUP là bất hợp pháp nếu không có mệnh đề GROUP BY

Bạn có thể viết lại truy vấn để hoạt động tốt như

mysql> SELECT name, MAX(age) FROM t GROUP BY name;

hoặc

Tắt ONLY_FULL_GROUP_BY và lỗi sẽ biến mất.

Liên kết có thể giúp bạn

  1. Bạn có thể tìm kiếm lỗi MySQL tại đây
  2. group-by-functions
  3. bài đăng tương tự trên stackoverflow.com
  4. một diễn đàn khác đã thảo luận vấn đề tương tự
  5. server-sql-mode

CẬP NHẬT

Đây là câu trả lời cho bình luận của bạn.

But i would like to know more about disabling the Group BY mode in mysql db.  

Chế độ máy chủ SQL

  • Máy chủ MySQL có thể hoạt động ở các chế độ SQL khác nhau và có thể áp dụng các chế độ này khác nhau cho các máy khách khác nhau, tùy thuộc vào giá trị của sql_mode biến hệ thống. Khả năng này cho phép mỗi ứng dụng điều chỉnh chế độ hoạt động của máy chủ theo yêu cầu riêng của nó.

  • Để đặt chế độ SQL khi khởi động máy chủ, hãy sử dụng --sql-mode="modes" trên dòng lệnh hoặc sql-mode="modes" trong một tệp tùy chọn, chẳng hạn như my.cnf (Unix operating systems) hoặc my.ini (Windows) . chế độ là danh sách các chế độ khác nhau được phân tách bằng dấu phẩy. Để xóa chế độ SQL một cách rõ ràng, hãy đặt nó thành một chuỗi trống bằng cách sử dụng --sql-mode="" trên dòng lệnh hoặc sql-mode="" trong một tệp tùy chọn.

  • Để thay đổi chế độ SQL trong thời gian chạy, hãy sử dụng

    SET [GLOBAL|SESSION] sql_mode='modes' Câu lệnh
    để đặt biến hệ thống sql_mode. Đặt biến GLOBAL yêu cầu đặc quyền SUPER và ảnh hưởng đến hoạt động của tất cả các máy khách kết nối từ thời điểm đó trở đi. Đặt biến SESSION chỉ ảnh hưởng đến ứng dụng khách hiện tại. Bất kỳ máy khách nào cũng có thể thay đổi giá trị sql_mode phiên của chính nó bất kỳ lúc nào.

  • Để xác định giá trị sql_mode phiên hoặc toàn cục hiện tại, hãy sử dụng các câu lệnh sau:

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;

  • Bạn có thể tham khảo bảng sql_mode

I followed the manuals, Added the ONLY_FULL_GROUP_BY in sql-mode
but no difference.  

Điều này xảy ra do phiên bản MySQL. Phiên bản MySQL của máy tính cục bộ của bạn là gì?

Làm thế nào để kiểm tra phiên bản MySQL?

mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.5.28    |
+-----------+
1 row in set (0.00 sec)    

Để kiểm tra sql_mode ONLY_FULL_GROUP_BY , Tôi đã tạo bảng patient với hai cột id, name và các bản ghi đã chèn. Hãy nhớ sql_mode ONLY_FULL_GROUP_BY không phải là đặt mặc định, bạn cần phải đặt nếu muốn.

1) Phiên bản MySQL 5.0.45-community-nt

SELECT name, MAX(id) FROM patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Không thành công, không có ích gì khi đặt sql_mode thành ONLY_FULL_GROUP_BY vì nó sẽ không cho phép các cột không được tổng hợp không có tên trong mệnh đề GROUP BY.

2) Phiên bản MySQL 5.1.40-community

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Sau đó, sau khi thiết lập sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

3) Phiên bản MySQL 5.5.28

mysql> SELECT name, MAX(id) from patient;
+----------+--------+
| MAX(id)  | name   |
+----------+--------+
|       33 | aniket |
+----------+--------+
1 row in set (0.03 sec)  

Sau đó, sau khi thiết lập sql_mode ONLY_FULL_GROUP_BY

mysql> set sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT name, MAX(id) from patient;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause  

Kết luận

Như bạn có thể thấy truy vấn không thành công trên phiên bản 5.0.45 và thành công trên / sau 5.1.40 và 5.5.28 Trước phiên bản MySQL 5.1.10 (không chắc chắn) truy vấn không có GROUP BY không thành công bất kể sql_mode ONLY_FULL_GROUP_BY đặt hay không.

Một số lỗi thú vị và liên kết câu hỏi thường gặp về sql_mode

  1. ONLY_FULL_GROUP_BY chế độ sql quá hạn chế
  2. sql-mode:chỉ nhóm đầy đủ theo chế độ không hoạt động
  3. Câu hỏi thường gặp về MySQL 5.0:Chế độ Máy chủ SQL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi MySQL:# 1142 - Lệnh SELECT bị từ chối đối với người dùng

  2. Nhóm hàng sử dụng mệnh đề nhóm theo trong MySQL

  3. Chọn các bản ghi tháng hiện tại mysql từ cột dấu thời gian

  4. Chuỗi tới joda LocalDate ở định dạng dd-MMM-yy

  5. Làm thế nào để sử dụng toán tử lớn hơn với ngày?