MySQL "ERROR 1046 (3D000): не выбрана база данных" в запросе обновления

У меня есть запрос 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 и особенно последнее (неотвеченное) сообщение …

Solutions Collecting From Web of "MySQL "ERROR 1046 (3D000): не выбрана база данных" в запросе обновления"

У вас неправильные поля, но даже если вы их исправите, это ошибка в 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 с UPDATE с двойными вложенными запросами и без базы данных по умолчанию ( SELECT или однопользовательские запросы или работа с базами данных по умолчанию)

У вас есть неправильные имена полей в инструкции UPDATE –

  • Что такое s.object ? s.id_object2 это не s.id_object2 ?
  • Что такое lur.object1 ? lur.id_object1 это не lur.id_object1 ?
  • Что такое lur.object2 ? lur.id_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 

Когда я устанавливаю имя базы данных по умолчанию, проблема исчезла.

Помните, что вы не можете использовать внешние ключи, если для параметра «Двигатель» установлено значение «MyISAM». Не только таблица, в которой вы создаете внешний ключ, должна быть InnoDB, но таблица, в которой вы получаете ключ, также должна быть InnoDB.

Я получал ту же ошибку, что и вы, и вытягивал волосы за несколько дней, прежде чем я подумал об этом. Я вошел в каждую из своих столов и убедился, что для каждого из них установлены InnoDB, и теперь у меня нет проблем с настройкой внешних ключей.