Задавайте вопросы, мы ответим
Вы не зашли.
Имеется база данных. Скажу сразу - она составлена неправильно, но отказаться от неё пока нельзя.
Есть таблица table1 с колонками id_client, sw_ip
Вот например запись от туда:
id_client sw_ip
252 192.168.10.11
В колонке switch_ip содержится запись о том, к какому маршрутизатору привязан клиент.
Для каждого маршрутизатора создана своя отдельная таблица, например для маршрутизатора 192.168.10.11 таблица будет называться sw_1011.
В этой таблице тоже есть поле id_client.
Мне необходимо удалить из базы данных записи о клиенте. Хотелось бы сделать это одним запросом. Хотел попробовать использовать динамический sql, чтобы формировать имя таблицы.
Отредактированно IGV (27.08.2009 12:52:25)
Неактивен
У Вас слишком много табуляций и ентеров — из-за этого Вы путаетесь в параметрах
mysql> select CONCAT('sw_', REPLACE(SUBSTRING_INDEX(( SELECT '192.168.10.11' ), '.', -2), '.', ''));
+---------------------------------------------------------------------------------------+
| CONCAT('sw_', REPLACE(SUBSTRING_INDEX(( SELECT '192.168.10.11' ), '.', -2), '.', '')) |
+---------------------------------------------------------------------------------------+
| sw_1011 |
+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Неактивен
вот переписал, нашел ошибку. Я для команды Replace забыл указать что заменить, т.е. забыл второй параметр '.' спасибо за хороший совет.
Отредактированно IGV (27.08.2009 14:31:51)
Неактивен
Неактивен
Спасибо исправил, это прокатило.
Но он почему то удалил только из таблицы SW_CL. В чем может быть проблема?
Отредактированно IGV (27.08.2009 15:13:56)
Неактивен
У Вас ON не связывает таблицы — я бы на месте MySQL вообще обиделся и не отвечал на такие запросы
Перепишите в виде, который понятный и правильный — DELETE a, b FROM a, b WHERE a.id = 252 OR b.id=252.
А зачем Вам это делать одним запросом? Все равно ж хранимая процедура будет?
Неактивен
paulus написал:
У Вас ON не связывает таблицы — я бы на месте MySQL вообще обиделся и не отвечал на такие запросы
А он видимо и обиделся
Ведь строго говоря: The conditional_expr used with ON is any conditional expression of the form that can be used in a WHERE clause.
И селект с таким извращенным левым джойном проходит на ура. По идее и delete аналогично должен был пройти без проблем.
Неактивен
В общем я пишу программу на C#. Я использую connector.net 6.1. Поэтому хотел написать sql-скрипт, который можно было бы отправить и он выполнился бы. Поэтому и писал его. О хранимых процедурах ничего не знаю. Надо будет почитать.
В общем в коде это выглядит вот так
Отредактированно IGV (28.08.2009 11:32:04)
Неактивен
Почитайте про параметры вот тут http://dev.mysql.com/doc/refman/5.1/en/ … orial.html
21.2.4.1.4. Working with Parameters; это куда проще и куда безопаснее в смысле
SQL injection, чем то, что делаете Вы.
Неактивен
прочитал, исправил. Но проблему это не решило.
Неактивен
Значится так, решил всё сделать на Stored Procedures, как вы и посоветовали.
Создал хранимую процедуру, вот её полный текст:
Отредактированно IGV (28.08.2009 19:17:45)
Неактивен
Кодировки cp1251 и koi8r не полностью совместимы. Попробуйте сделать базу
в utf8 или непосредственно в cp1251.
Неактивен
Спасибо, помогло. Плюс если вызывать процедуру из программы всё тоже работает. Спасибо БОЛЬШОЕ. Единственное я так и не понял почему если передавать этот скрипт, как обычную SQL команду, выкидывается исключение fatal error?
Неактивен