Tôi có truy vấn UPDATE nơi tôi tham chiếu một cách rõ ràng cơ sở dữ liệu, nhưng MySQL vẫn than phiền với thông báo: ERROR 1046 (3D000): No database selected
.MySQL "ERROR 1046 (3D000): Không có cơ sở dữ liệu nào được chọn" trên truy vấn cập nhật
Các truy vấn khác tương tự cấu trúc, nhưng sử dụng công việc INSERT tốt. Các truy vấn khác chỉ thực hiện các lệnh SELECT cũng chạy tốt.
Để lặp lại vấn đề trong một trường hợp thử nghiệm, hãy thử chạy các truy vấn này:
create table test.object1 (
id_object1 int unsigned not null auto_increment,
total int,
weight int,
dt datetime,
primary key (id_object1)
) engine=InnoDB;
create table test.object2 (
id_object2 int unsigned not null auto_increment,
primary key (id_object2)
) engine=InnoDB;
create table test.score (
id_object1 int unsigned not null,
id_object2 int unsigned not null,
dt datetime,
score float,
primary key (id_object1, id_object2),
constraint fk_object1 foreign key (id_object1) references object1 (id_object1),
constraint fk_object2 foreign key (id_object2) references object2 (id_object2)
) engine=InnoDB;
insert into test.object1 (id_object1, total, weight, dt) values (1, 0, 0, '2012-01-01 00:00:00');
insert into test.object1 (id_object1, total, weight, dt) values (2, 0, 0, '2012-01-02 00:00:00');
insert into test.object2 (id_object2) values (1);
insert into test.score (id_object1, id_object2, dt, score) values (1, 1, '2012-01-03 00:00:00', 10);
insert into test.score (id_object1, id_object2, dt, score) values (2, 1, '2012-01-04 00:00:00', 8);
update test.object1 p
join (
select ur.id_object1, sum(ur.score * ur.weight) as total, count(*) as weight
from (
select lur.*
from (
select s.id_object1, s.id_object2, s.dt, s.score, 1 as weight
from test.score as s
join test.object1 as o1 using(id_object1)
where s.dt > o1.dt
order by s.id_object1, s.id_object2, s.dt desc
) as lur
group by lur.id_object2, lur.id_object1, date(lur.dt)
order by lur.id_object1, lur.id_object2
) as ur
group by ur.id_object1
) as r using(id_object1)
set
p.total = p.total + r.total,
p.weight = p.weight + r.weight,
p.dt = now();
Lưu ý: Tôi đang chạy các truy vấn từ một môi trường PHP và tôi đã KHÔNG explicitely sử dụng mysql_select_db ('test'), bởi vì tôi không thích và không có yêu cầu nào khác (nhiều!) yêu cầu nó. Tôi chắc chắn rằng bằng cách sử dụng mysql_select_db sẽ giải quyết vấn đề của tôi, nhưng tôi muốn biết tại sao chính xác truy vấn cụ thể này không hoạt động.
Vì so sánh: nếu bạn muốn chạy truy vấn đơn giản này, cũng không sử dụng mysql_select_db, mọi thứ hoạt động tốt:
update test.object1 set total=1, weight=1, dt=now() where id_object1=1;
Tôi đã tìm kiếm vô ích. Điều duy nhất tôi thấy rằng đến gần, đã báo cáo này lỗi: http://bugs.mysql.com/bug.php?id=28551 và đặc biệt là cuối cùng (chưa được trả lời) nhắn ...
Nó có lẽ chỉ là cái đầu tiên ... – Shoe
điều này có thể âm thanh ngớ ngẩn nhưng bạn có thể thay thế "now()" theo ngày thủ công ngẫu nhiên thay thế và thử lại không? – Sebas
@Sebas Tôi vừa làm, không có sự khác biệt. Tại sao điều đó lại quan trọng? – webtweakers