6

我有一个 UPDATE 查询,我在其中明确引用了数据库,但 MySQL 仍然抱怨消息:ERROR 1046 (3D000): No database selected.

其他结构相似但使用 INSERT 的查询可以正常工作。仅执行 SELECT 的其他查询也可以正常运行。

要在测试用例中重复该问题,请尝试运行以下查询:

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

注意:我在 PHP 环境中运行这些查询,并且没有明确使用 mysql_select_db('test'),因为我不喜欢这样做,而且其他(很多!)查询都不需要它。我确信使用 mysql_select_db 会解决我的问题,但我想知道为什么这个特定的查询不起作用。

为了比较起见:如果您运行这个更简单的查询,也不使用 mysql_select_db,一切正常:

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

我已经搜索无济于事。我发现唯一接近的就是这个错误报告:http ://bugs.mysql.com/bug.php?id=28551 ,尤其是最后一条(未答复的)消息......

4

3 回答 3

3

您的字段名称不正确,但即使您更正它们,这也是一个错误,MySQL如果您没有默认数据库,则不会让您这样做。

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

该问题特定于UPDATE双嵌套查询且没有默认数据库(SELECT或单嵌套查询或默认数据库工作正常)

于 2012-05-18T13:51:27.907 回答
1

您在 UPDATE 语句中有一些错误的字段名称 -

  • 是什么s.object?不应该s.id_object2吗?
  • 是什么lur.object1?不应该lur.id_object1吗?
  • 是什么lur.object2?不应该lur.id_object2吗?
  • 最后是什么ur.id_object

修复所有这些问题并尝试再次更新;-)


我第一次运行这个脚本时遇到了这个错误。我的输出:

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

当我设置默认数据库名称时,问题消失了。

于 2012-05-18T13:42:49.373 回答
0

请记住,当引擎设置为 MyISAM 时,您不能使用外键。您创建外键的表不仅需要是 InnoDB,而且您从中获取键的表也需要是 InnoDB。

在我想到这一点之前,我遇到了和你一样的错误并且把我的头发拉了几天。我进入了我的每个表,并确保每个表的引擎都设置为 InnoDB,现在设置外键没有问题。

于 2013-09-26T19:15:53.923 回答