Я использую mysqli и теперь пытаюсь получить представление из фрагмента кода SQL (сгенерированного MySQL Workbench) в базу данных.
$query = <<<QUERY DROP VIEW IF EXISTS `myview` ; SHOW WARNINGS; DROP TABLE IF EXISTS `myview`; SHOW WARNINGS; DELIMITER $$ CREATE OR REPLACE VIEW `myview` AS ...view definition... $$ DELIMITER ; ; SHOW WARNINGS; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; QUERY; $result = mysqli_multi_query($dbConnection, $query);
Это не работает. Нет ошибок, утверждение просто игнорируется. Он работает только, если я удалю определения разделителя (строки DELIMITER $$
, $$
и DELIMITER ;
).
Почему это не работает? Что я могу сделать, чтобы использовать разделители в операторах SQL, переданных в функции и методы mysqli
?
Спасибо
Это источник, который помог мне понять это … http://zend-framework-community.634137.n4.nabble.com/Problems-changing-the-sql-end-of-statement-delimiter-tp2124060p2124276.html
DELIMITER не является фактическим заявлением MySQL.
Я считаю, что это то, что некоторые клиенты MySQL реализовали для одновременной доставки нескольких операторов sql.
Драйвер mysqli не реализует эту функциональность.
Итак, это должно сработать.
$query = <<<QUERY DROP VIEW IF EXISTS `myview` ; SHOW WARNINGS; DROP TABLE IF EXISTS `myview`; SHOW WARNINGS; CREATE OR REPLACE VIEW `myview` AS ...view definition... ; SHOW WARNINGS; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; QUERY; $result = mysqli_multi_query($dbConnection, $query);
Я столкнулся с той же проблемой, с тем же драйвером mysqli, с функцией multi_query (с использованием разделителей при создании процедур) и удалением DELIMITER с моего SQL.