SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'shanhai.n.money' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
时间: 2023-10-13 17:05:00 浏览: 84
这个错误是由于MySQL的sql_mode设置为了only_full_group_by,它要求在GROUP BY语句中的所有列都必须是聚合函数或者在GROUP BY语句中出现的列。解决这个问题可以有两种方法:
1. 修改MySQL的sql_mode配置,去掉only_full_group_by。可以在MySQL的配置文件中修改,也可以在MySQL命令行中执行SET GLOBAL sql_mode='...'命令来修改。
2. 修改SQL查询语句,使得所有非聚合列都出现在GROUP BY语句中。例如,将查询语句中的money列也加入到GROUP BY语句中。
相关问题
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
当你遇到这个SQL错误 "SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes",它通常表示你在尝试创建一个索引或者设置某个字段作为键(key)的时候,超过了MySQL数据库系统允许的最大长度限制,这个最大长度通常是767字节(Bytes)。MySQL对于一些列的数据类型,如CHAR、VARCHAR等,其对应的唯一键或全文索引不能超过这个大小。
解决这个问题的方法有:
1. 减小列的数据类型,比如将VARCHAR(255)改为VARCHAR(100),或者使用BINARY或TINYBLOB等较小的存储类型。
2. 如果需要保存更长的文本,考虑使用TEXT、MEDIUMTEXT或LONGTEXT类型,它们不受此限制,但是查询性能可能会降低。
3. 如果你需要创建复合键,可以将较长的部分与其他较短部分结合,分散过长部分的长度。
CREATE TRIGGER check_room_availability_trigger BEFORE INSERT ON has_BookingRel FOR EACH ROW BEGIN DECLARE available_rooms INT; SELECT room_num - IFNULL(SUM(booked_quantity), 0) INTO available_rooms FROM room_types LEFT JOIN has_BookingRel ON room_types.id = has_BookingRel.room_type_id WHERE room_types.id = NEW.room_type_id; GROUP BY room_types.id, room_types.name, room_types.price; IF available_rooms < NEW.booked_quantity THEN SIGNAL SQLSTATE “45000” SET MESSAGE_TEXT = ‘房间数量不足’; END IF; END;所以这个触发器该怎样改:1140 - In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'h.room_types.room_num'; this is incompatible with sql_mode=only_full_group_by
这个错误是由于 MySQL 5.7.5 版本之后默认启用了 only_full_group_by 模式,而在该模式下,如果 SELECT 语句中的列没有在 GROUP BY 子句中出现,那么 MySQL 将会报错。在你的触发器代码中,SELECT 语句中的 room_num 列没有在 GROUP BY 子句中出现,因此会报这个错误。你需要将这个 SELECT 语句中的列改为聚合函数,比如使用 SUM()。
改为以下代码:
```
CREATE TRIGGER check_room_availability_trigger BEFORE INSERT ON has_BookingRel FOR EACH ROW
BEGIN
DECLARE available_rooms INT;
SELECT room_types.room_num - IFNULL(SUM(has_BookingRel.booked_quantity), 0) INTO available_rooms
FROM room_types
LEFT JOIN has_BookingRel ON room_types.id = has_BookingRel.room_type_id
WHERE room_types.id = NEW.room_type_id
GROUP BY room_types.id, room_types.name, room_types.price, room_types.room_num;
IF available_rooms < NEW.booked_quantity THEN
SIGNAL SQLSTATE “45000” SET MESSAGE_TEXT = ‘房间数量不足’;
END IF;
END;
```
这样改动后,应该就可以避免这个错误了。
阅读全文