Сделайте что-нибудь, если таблица существует - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь выяснить, есть ли таблица с именем OOK, и если да, что-то с ней сделать.Это то, что я имею до сих пор, которое не работает с полезным ERROR 1064 […] syntax error сообщением:

IF show tables like 'OOK' THEN
    DELETE FROM OOK WHERE Id = 'Development';
    INSERT INTO OOK VALUES ( 'Development', 'Localhost' );
END IF

Это для поддержки некоторого унаследованного кода и, возможно, не лучшее решение проблемы.Однако, это исправит то, что мне нужно.

Поскольку я получаю много синтаксических ошибок в ответах, вот точная версия, которую я имею: Server version: 5.5.60-MariaDB MariaDB Server.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я использую описанную ниже процедуру и функцию в процессе дублирования таблицы в БД:

Использование

CALL do_something('mydb', 'OOK', 'Development', 'Development', 'Localhost');

Реализация

DELIMITER $$;
CREATE PROCEDURE do_something(
  IN dbName VARCHAR(255),
  IN tableName VARCHAR(255),
  IN id VARCHAR(255),
  IN value1 VARCHAR(255),
  IN value2 VARCHAR(255)
)
  BEGIN
    IF ( fn_table_exists(dbName, tableName) )
      THEN
        CALL statement(CONCAT(
          'DELETE FROM ', tableName, ' WHERE Id = "', id, '"'));
        CALL statement(CONCAT(
          'INSERT INTO ', tableName, ' VALUES ( "', value1, '", "', value2, '" )'));
      ELSE
        SELECT CONCAT(
          'ERROR: Table "', tableName, '" does not exist in the schema "', dbName, '".'
        ) AS ErrorMessage;
      END IF;
END$$
DELIMITER ;

DELIMITER $$;
CREATE PROCEDURE statement(IN dynamic_statement TEXT)
  BEGIN
      SET @dynamic_statement := dynamic_statement;
      PREPARE prepared_statement FROM @dynamic_statement;
      EXECUTE prepared_statement;
      DEALLOCATE PREPARE prepared_statement;
  END$$
DELIMITER ;

DELIMITER $$;
CREATE FUNCTION fn_table_exists(dbName VARCHAR(255), tableName VARCHAR(255))
  RETURNS TINYINT(1)
  BEGIN
    DECLARE totalTablesCount INT DEFAULT (
      SELECT COUNT(*)
      FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = dbName COLLATE utf8_general_ci)
        AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
    );
    RETURN IF(
      totalTablesCount > 0,
      TRUE,
      FALSE
    );
END$$
DELIMITER ;
0 голосов
/ 24 октября 2018

Вы можете получить доступ к Информационная схема , чтобы проверить, существует таблица или нет.Также вам нужно будет использовать Динамический SQL (для обработки случая, когда имя таблицы не существует)

Попробуйте что-то вроде ниже:

IF EXISTS (SELECT 1
           FROM information_schema.tables 
           WHERE table_schema = 'your_database_name' 
           AND table_name = 'OOK') THEN 

  SET @s1 = 'DELETE FROM your_database_name.OOK WHERE Id = ?';
  SET @a = 'Development';
  PREPARE stmt1 FROM @s1;
  EXECUTE stmt1 USING @a;
  DEALLOCATE PREPARE stmt1;

  SET @s2 = 'INSERT INTO your_database_name.OOK VALUES (?, ?)';
  SET @b = 'Development';
  SET @c = 'Localhost';
  PREPARE stmt2 FROM @s2;
  EXECUTE stmt1 USING @b, @c;
  DEALLOCATE PREPARE stmt2;

END IF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...