2012-05-18 31 views
5

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 ...

+0

Nó có lẽ chỉ là cái đầu tiên ... – Shoe

+0

đ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

+0

@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

Trả lời

2

Bạn có các trường được đặt tên không chính xác, nhưng ngay cả khi bạn sửa chúng, đây là lỗi trong MySQL sẽ không cho phép bạn thực hiện nếu bạn không có cơ sở dữ liệu mặc định.

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_object1, lur.id_object1, date(lur.dt) 
       order by 
         lur.id_object1, lur.id_object1 
       ) 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(); 

Vấn đề là cụ thể cho UPDATE với các truy vấn đúp lồng nhau và không có cơ sở dữ liệu mặc định (SELECT hoặc truy vấn đơn lồng nhau hoặc mặc định làm việc tốt cơ sở dữ liệu)

1

Bạn có một số tên trường sai trong câu lệnh UPDATE -

  • s.object là gì ? Không phải là s.id_object2?
  • lur.object1 là gì? Không phải là lur.id_object1?
  • lur.object2 là gì? Không phải là lur.id_object2?
  • ur.id_object ở cuối là gì?

Fix tất cả những vấn đề này và cố gắng cập nhật một lần nữa ;-)


Lần đầu tiên tôi chạy kịch bản này, tôi đã nhận lỗi đó. Đầu ra của tôi:

1 row inserted [0,184s] 
1 row inserted [0,068s] 
1 row inserted [0,066s] 
1 row inserted [0,147s] 
1 row inserted [0,060s] 
Error (32,1): No database selected 

Khi tôi đặt tên cơ sở dữ liệu mặc định, sự cố đã biến mất.

+0

Rất tiếc, tôi đã xấu. Bạn nói đúng, tôi đã thực hiện một số lỗi chính tả trong khi chuyển đổi mã của tôi thành ví dụ này. Bây giờ nó đã được sửa. Vẫn còn vấn đề tương tự. – webtweakers

0

Hãy nhớ rằng bạn không thể sử dụng phím nước ngoài khi Engine là đặt thành MyISAM. Không chỉ bàn mà bạn đang tạo ra một khóa ngoại trong cần phải là InnoDB, nhưng bảng mà bạn đang nhận được chìa khóa từ cũng cần phải là InnoDB.

Tôi đã nhận được cùng một lỗi như bạn và kéo tóc của tôi ra cho ngày trước khi tôi nghĩ về điều này. Tôi đã đi vào mỗi bảng của tôi và chắc chắn rằng các Engines đã được thiết lập để InnoDB cho mỗi một, và bây giờ tôi không có vấn đề thiết lập các phím nước ngoài.

Các vấn đề liên quan