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

You have some wrong field names in the UPDATE statement -

  • What is s.object? Shouldn't it be s.id_object2?
  • What is lur.object1? Shouldn't it be lur.id_object1?
  • What is lur.object2? Shouldn't it be lur.id_object2?
  • What is ur.id_object at the end?

Fix all these issues and try to update again;-)


First time I ran this script I got that error. My output:

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

When I set default database name the problem disappeared.

于 2012-05-18T13:42:49.373 に答える
0

Engine が MyISAM に設定されている場合は、外部キーを使用できないことに注意してください。外部キーを作成するテーブルが InnoDB である必要があるだけでなく、キーを取得するテーブルも InnoDB である必要があります。

私はあなたと同じエラーが発生し、これを考える前に何日も髪を引っ張っていました. 各テーブルにアクセスし、それぞれのエンジンが InnoDB に設定されていることを確認しました。これで、外部キーの設定に問題はなくなりました。

于 2013-09-26T19:15:53.923 に答える