2012-05-18 16 views
5

Tengo una consulta de actualización donde explícitamente hago referencia a la base de datos, pero MySQL todavía se queja con el mensaje: ERROR 1046 (3D000): No database selected.MySQL "ERROR 1046 (3D000): ninguna base de datos seleccionada" en la consulta de actualización

Otras consultas que son similares a la estructura, pero usan una multa de trabajo INSERT. Otras consultas que solo realizan SELECT también funcionan bien.

Para repetir el problema en un caso de prueba, intente ejecutar estas consultas:

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: Estoy corriendo estas consultas desde un entorno PHP y no he utilizado explícitamente mysql_select_db ('test'), porque prefiero no hacerlo y ninguna de las otras (¡muchas!) consultas lo requiere. Estoy seguro de que usar mysql_select_db resolvería mi problema, pero me gustaría saber por qué exactamente esta consulta en particular no funciona.

Por el bien de comparación: si lo ejecuta esta consulta simple, también sin utilizar mysql_select_db, todo funciona bien:

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

He buscado en vano. El único que encontré que estuvo cerca, era este informe de error: http://bugs.mysql.com/bug.php?id=28551 y sobre todo el mensaje final (sin respuesta) ...

+0

Probablemente sea el primero ... – Shoe

+0

esto puede sonar tonto, pero ¿podría reemplazar "ahora()" por una fecha manual al azar en su lugar e intentarlo de nuevo? – Sebas

+0

@Sebas Lo acabo de hacer, no hay diferencia. ¿Por qué importaría eso? – webtweakers

Respuesta

2

Tiene campos con nombres incorrectos, pero incluso si los corrige, este es un error en MySQL que no le permitirá hacerlo si no tiene una base de datos predeterminada.

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

El problema es específico de UPDATE con consultas de doble anidada y ninguna base de datos por defecto (SELECT o consultas de un solo anidados o por defecto funcionan bien la base de datos)

1

usted tiene algunos nombres de campo incorrectas en la instrucción UPDATE -

  • ¿Cuál es s.object ? ¿No debería ser s.id_object2?
  • ¿Qué es lur.object1? ¿No debería ser lur.id_object1?
  • ¿Qué es lur.object2? ¿No debería ser lur.id_object2?
  • ¿Qué es ur.id_object al final?

Fix todos estos temas y tratar de actualización de nuevo ;-)


primera vez que me encontré con este script que tengo ese error. Mi salida:

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 

Cuando establecí el nombre predeterminado de la base de datos, el problema desapareció.

+0

Vaya, mi mal. Tienes razón, hice algunos errores al convertir mi código a este ejemplo. Está arreglado ahora. Todavía el mismo problema. – webtweakers

0

Recuerde que usted no puede utilizar las claves externas cuando el motor está establecer a MyISAM. La tabla en la que está creando una clave externa no solo necesita ser InnoDB, sino que la tabla de la que obtiene la clave también debe ser InnoDB.

Estaba recibiendo el mismo error que usted y tirando de mi cabello durante días antes de pensar en esto. Entré en cada una de mis tablas y me aseguré de que los motores estuvieran configurados en InnoDB para cada uno, y ahora no tengo problemas para configurar las claves externas.

Cuestiones relacionadas