если таблица не существует, выполнить длинный запрос - PullRequest
1 голос
/ 30 января 2012

Я использую MySQL 5.0+ и пытаюсь выполнить большой список команд, если таблица не существует.Поэтому я хотел бы иметь:

if not exist table
then
10000 line query that creates and populates the table with a lot of entries.
end if

Единственная проблема в том, что я искал, и до сих пор я обнаружил, что MySQL не поддерживает такую ​​функцию.

В настоящий моментУ меня есть:

IF NOT EXISTS `profiles`
THEN
    A LOT OF QUERIES;
END IF;

По какой-то причине он продолжает давать мне сообщение об ошибке, говоря, что синтаксис в строке 1 неверен.

Поэтому мне было интересно, если у кого-нибудь получится получить лучшую идею относительнокак подойти к этой проблеме или как ее исправить.

Ответы [ 4 ]

3 голосов
/ 30 января 2012

Добавление к коду из bfavaretto, если у вас есть information_schema.tables, попробуйте что-то вроде этого:

IF NOT EXISTS (SELECT * FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename')
do your big long create table stuff
1 голос
/ 30 января 2012

Вы должны запросить базу данных information_schema.Нашел этот ответ на MySQL Forums :

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';
0 голосов
/ 09 июля 2014

Вы можете попробовать что-то вроде:

select * from table1 where exists (select table_name from information_schema.tables where table_schema=database() and table_name = 'table1');

'select * from table1' произойдет, только если table1 существует в текущей базе данных. Это хороший способ обойти запрос информации в несуществующей таблице, что приводит к ошибке. Вы можете запустить это вне хранимой процедуры, и вам нужно будет добавить «где существует ...» к каждому из ваших запросов. См. http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html для получения дополнительной информации.

0 голосов
/ 30 января 2012

Вы можете попробовать что-то вроде

CREATE PROCEDURE test()
BEGIN
  DECLARE tmp INT;
  DECLARE CONTINUE HANDLER FOR  1146  -- 1146 - table does not exist
  BEGIN
     -- A lot of queries
  END;
  SELECT 1 INTO tmp FROM profiles LIMIT 1; -- INTO just to prevent any output
END;
...