2012-05-18 11 views
5

Ho una query UPDATE in cui faccio riferimento in modo esplicito al database, ma MySQL continua a lamentarsi del messaggio: ERROR 1046 (3D000): No database selected.MySQL "ERROR 1046 (3D000): nessun database selezionato" nella query di aggiornamento

Altre query simili a struttura, ma utilizzano un valore di lavoro INSERT. Anche altre query che eseguono solo SELECT funzionano correttamente.

Per ripetere il problema in un banco di prova, provare a eseguire queste query:

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(); 

Nota: Io corro queste query da un ambiente PHP e non ho usato esplicitamente mysql_select_db ('test'), perché preferisco non farlo e nessuna delle altre (molte!) richieste lo richiede. Sono sicuro che usare mysql_select_db risolverà il mio problema, ma vorrei sapere perché esattamente questa particolare query non funziona.

Per l'amor di confronto: se ci si esegue questa query più semplice, anche senza l'utilizzo di mysql_select_db, tutto funziona bene:

update test.object1 set total=1, weight=1, dt=now() where id_object1=1; 

ho cercato inutilmente. L'unica cosa che ho trovato che è venuto vicino, è stato questo bug report: http://bugs.mysql.com/bug.php?id=28551 e soprattutto che ultimo messaggio (senza risposta) ...

+0

Probabilmente è solo il primo ... – Shoe

+0

questo potrebbe sembrare sciocco, ma potresti sostituire "now()" con una data manuale casuale invece e riprovare? – Sebas

+0

@Sebas Ho appena fatto, nessuna differenza. Perché dovrebbe importare? – webtweakers

risposta

2

Hai campi denominati in modo errato, ma anche se li correggi, questo è un bug in MySQL che non ti consente di farlo se non hai un database predefinito.

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(); 

Il problema è specifico per UPDATE con le query doppio nidificato e nessun database predefinito (SELECT o query single-nidificate o multa di lavoro database predefinito)

1

avete un po 'i nomi dei campi sbagliato nell'istruzione UPDATE -

  • Cos'è s.object ? Non dovrebbe essere s.id_object2?
  • Che cos'è lur.object1? Non dovrebbe essere lur.id_object1?
  • Che cos'è lur.object2? Non dovrebbe essere lur.id_object2?
  • Che cos'è ur.id_object alla fine?

risolvere tutti questi problemi e tentare di aggiornare nuovamente ;-)


prima volta che ho eseguito questo script ho ottenuto questo errore. La mia uscita:

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 

Quando ho impostato il nome del database predefinito il problema è scomparso.

+0

Oops, mio ​​male. Hai ragione, ho fatto alcuni errori durante la conversione del mio codice in questo esempio. È riparato ora. Ancora lo stesso problema. – webtweakers

0

Ricordate che non è possibile utilizzare le chiavi esterne quando il motore è impostato su MyISAM. InnoDB non solo la tabella in cui si sta creando una chiave esterna deve essere InnoDB, ma anche la tabella da cui si ottiene la chiave deve essere InnoDB.

Mi stavo facendo lo stesso errore e tiravo fuori i capelli per giorni prima che pensassi a questo. Sono entrato in ciascuno dei miei tavoli e mi sono assicurato che i Motori fossero impostati su InnoDB per ognuno di essi, e ora non ho problemi nell'impostare le chiavi esterne.

Problemi correlati