Задавайте вопросы, мы ответим
Вы не зашли.
Интересует, существует ли универсальный алгоритм удаления записей из MySQL.
Например удаление записей из таблицы `mysql`.`user` phpMySQLAdmin производит по главному ключу. Аналогично в нем производится удаление из любых других таблиц. Вот пример:
DELETE FROM `mysql`.`user` WHERE `user`.`Host` = CAST(0x25 AS BINARY) AND `user`.`User` = CAST(0x776974686f6e6c7973656c656374 AS BINARY) LIMIT 1;
Мне такая запись не совсем понятна. Но ясно, что берется шетнадцатеричный код текста каждого поля из главного ключа таблицы и сообщает MySQL что это двоичные представление данных.
Если действовать так , то перед составлением запроса необходимо получить шестнадцатеричное представление данных.
Нет ли алгоритма проще? И универсален ли этот алгоритм?
Знать необходимо для написания MySQL клиента выполняющего часть функций phpMySQLAdmin, по аналогии.
Неактивен
Мне не очень понятно, почему не так:
Неактивен
phpmyadmin — вообще странная штука. Не старайтесь ориентироваться
на него. Он пишет отвратительные запросы (взять хотя бы приведенный
Вами). Пользователи должны удаляться командой DROP USER. Редактировать
системные таблицы вручную — гарантия разломанного сервера какой-нибудь
более высокой версии, чем та, на которой «точно протестировали и работало».
Неактивен
Здесь вопрос не в удалении пользователя. Вопрос в универсальном алгоритме удаления записей.
На самом деле phpMyAdmin также не использует универсальный запрос. Вот например запрос на удаление записи где первичным ключем являются два поля int1 и int2, оба типа INT(3) :
DELETE FROM `таблица1` WHERE `int1` = 1 AND CONVERT(`int2` USING utf8) = '3' LIMIT 1
Различия в первом и втором условии действительно кажутся странными.
------------------------
Если phpMyAdmin составляет не универсальные или просто некрасивые запросы, то по-возможности назовите клиент на который стоит ориентироваться. Необходимо чтобы выполняемые этим клиентом запросы можно было просмотреть.
Пробовал MySQL-Front, который тоже показывает выполняемые запросы. Но насколько я понял он больше приспособлен для создания структуры БД , чем для работы с данными. Кроме того не работает с кирилическими названиями баз данных и таблиц
MySQL Developer Studio также абсолютно не умеет работать с кирилицей в названиях таблиц и баз данных. Но главное - выдает ошибки при выполнении элементарных запросов составляемых им самим.
Отредактированно VladimirL (15.02.2010 10:28:56)
Неактивен
Можно программно анализировть типы данных полей и по ним уже формировать запрос на удаление записей. Но интересует, можно ли сформировать запрос который будет рабоать без подобного анализа.
Когда пользователь выбирает запись из таблицы текстовое представление значений из всех полей записи уже известно (подобно тому как это происходит в phpMyAdmin).
Можно ли использовать текстовые представления значений из полей, составляющих primary key, для однозначного определения записи и составления запроса на удаления, где в условии будут присутствовать исключительно текстовые представления.
Можно ли составить запрос вроде приведенного ниже (НЕРАБОТАЮЩЕГО)
DELETE FROM `table1`
WHERE (
СAST(`table1`.`int1` AS TEXT) = '1'
AND
СAST(`table1`.`int2` AS TEXT) = '3'
)
LIMIT 1
Если вместо 1 и 3 подставлять нужные значения можно было бы добиться универсального запроса, но насколько понимаю преобразования в TEXT и LONGTEXT в функции CAST не работают.
-----------------------
Работает запрос с использованием функции CONVERT вида
DELETE FROM `table1`
WHERE
CONVERT(`table1`.`int1` USING utf8) = '1'
AND
CONVERT(`table1`.`int2` USING utf8) = '3'
LIMIT 1
Но на каком основании используется кодировка utf8? (продолжаю уподобляться phpMyAdmin)
При создании таблицы была указана кодировка DEFAULT CHARSET=cp866.
Будет ли такой запрос универсальным?
Отредактированно VladimirL (15.02.2010 10:31:52)
Неактивен
VladimirL,
По моему вы хотите странного, зачем все усложнять? Нам известны поля первичного ключа, нам известны их типы данных, нам известны значения этих полей для идентификации записи. Зная все это, мы просто обязаны построить условие WHERE без всяких преобразований - `table1`.`int1`= 1 AND `table1`.`int2`= 3
По поводу русских букв в именах таблиц -опять усложняете себе жизнь.
Неактивен
byterus,
Это хорошо когда структура таблицы анализируется умным человеческим мозгом, приспособленным для работы с символьными данными.
В клиенте, который пишется на Java, для анализа типов данных и составления запроса в зависимости от них потребуется большое количество операторов ветвления. Сократить программу на несколько сотен строк вида if.... then.... else это всегда хорошо.
byterus написал:
По поводу русских букв в именах таблиц -опять усложняете себе жизнь.
В принципе согласен. Для того чтобы определить какой запрос должен составляться не нужно их использовать.
Просто отметил, что возможность использовать национальные символы в названиях структур в MySQL есть, и может оказаться очень удобной для пользователя из неанглоязычной страны.
phpMyAdmin эту возможность предоставляет, а указанные выше клиенты - нет.
Недостаток однако ))
Отредактированно VladimirL (15.02.2010 10:45:39)
Неактивен
VladimirL,
Редактирование данных задача не простая, программа обязана учитывать много тонкостей, для набора данных вообще важно знать а редактируемый ли он в принципе.
Вы пишете реализацию датасета?
Неактивен
Пишу кросплотформенное подобие phpMyAdmin, которое базируется не на php+Apache, а на Java. Десктопное приложение, но работать по идее должно под любой ОС. Если интересно, могу выложить то, что уже получилось.
То, что должна учитывать многое это понятно, но превращать код в монстра тоже не хочется.
--------------
Все же интересно, можно ли при известном текстовом представлении значений из полей использовать запрос типа приведенного ниже. Точнее будет ли такой запрос подходить для всех случаев.
DELETE FROM `<таблица>`
WHERE
CONVERT(`<таблица>`.`<поле>` USING utf8) = '<текстовое представление>' AND ......................
LIMIT 1
Возможно, кодировку UTF-8 следует указвывать потому, что сам MySQL использует ее на внутреннем уровне? Или потому что phpMyAdmin посылает данные серверу в этой кодировке?
Отредактированно VladimirL (15.02.2010 11:20:26)
Неактивен
VladimirL,
Да, конечно показывайте.
VladimirL написал:
CONVERT(`<таблица>`.`<поле>` USING utf8) = '<текстовое представление>' AND ......................
Для не бинарных строк и цифр наверно сработает, однако есть и другие типы данных, например даты. Имхо зря вы хотите упростить это место. Кстати, почему бы не воспользоваться стандартными компонентами? Зачем самостоятельно это делать?
Неактивен
Прикрепить файлы пока не могу - в инет через прокси вышел, который это запрещает. Через сутки выложу.
Создал таблицу с первичным ключем составленным из двух полей d1 типа DATE и i1 типа INT
Выполнил запрос :
INSERT INTO `tablewithdataprimekey` ( `d1` , `i1` )
VALUES ('2010-02-10', '1'), ('2010-02-11', '2');
Затем запрос :
DELETE FROM `tablewithdataprimekey` WHERE
CONVERT(`d1` USING utf8) = '2010-02-10'
AND
CONVERT(`i1` USING utf8) = '1'
LIMIT 1
Работает. Хотя вероятнее всего что для некоторых типов это действительно неприменимо.
Отредактированно VladimirL (15.02.2010 13:36:08)
Неактивен
Но ведь пользователю удобнее редактировать дату в национальном формате ЧЧ.ММ.ГГГГ например, и в этом случае будут проблемы.
Неактивен
Ох, сколько обсуждений Дайте я тоже сюда встряну со своими советами
1. phpmyadmin делает странное. Если в таблице есть PRIMARY KEY, то единственный
правильный способ идентифицировать строку — по этому ключу. Никакие CAST и
CONVERT применять не надо.
2. Если в таблице нет PRIMARY KEY, то автора такой таблицы нужно «варить три часа
до готовности, после чего вылить в унитаз». Тогда можете удалять по комбинации
*всех* доступных значений используя LIMIT 1 в конце, т.к. может не быть уникальности.
CAST и CONVERT применять не надо.
UPD: А вообще, писать еще один phpmyadmin не нужно, есть уже много хороших
утилит, которые справляются с редактированием таблиц. Например, MySQL GUI Tools.
Неактивен
paulus написал:
Если в таблице нет PRIMARY KEY, то автора такой таблицы нужно «варить три часа
до готовности, после чего вылить в унитаз»
Почему такой таблицы не должно быть? Иногда усложнение таблицы введением гавного ключа излишне. Взять например управленческий учет остатков чего-либо где-либо )) Если требуется учитывать только места накопления и изменение остатка, но время изменения или регестрирующий документ не важны, то достаточно поставить условие NOT NULL на места накопления и поле остатков. Никакие ключи не нужны.
paulus написал:
писать еще один phpmyadmin не нужно, есть уже много хороших утилит, которые справляются с редактированием таблиц. Например, MySQL GUI Tools
Скачивал отсюда http://dev.mysql.com/downloads/gui-tools/ . С немецких и японских зеркал. Файл все время поврежден.
То, что есть много разных утилит это понятно. Клиент этот пишу больше для саморазвития и личного применения - для работы с имеющейся офисной базой. Конечно, постараюсь когда-нибудь превратить его в стоящее приложение. Если получится, то это будет независимое от ОС приложение не требующее установки - скинул набор файлов на флешку вместе с JRE для Windows (в Линуках Open-JDK есть) и можно запускать прямо с нее.
То, что получается можно скачать по ссылке http://depositfiles.com/files/09e27wuit или http://files.mail.ru/MI9PNK
Запустится под JRE начиная с версии 1.6.0 - там файл readme надо прочитать. Думаю покажется удобным управление правами пользователей. Цвета интерфейса пускай не смущают - они такие по дефолту и в стиле Nimbus настраиваются после запуска клиента.
paulus написал:
Тогда можете удалять по комбинации *всех* доступных значений используя LIMIT 1
Это понятно, но все же, надеялся, что можно будет использовать уже известное, уже прочитанное из БД текстовое представление без учета типа значения. Теперь почти уверен, что нельзя, и придется проводить анализ типов перед составлением запроса. Функция CONVERT(`поле` USING utf8) не подходит - доступные аргументы для нее это BINARY, DATE, DATETIME , SIGNED, TIME и UNSIGNED.
Если что-нибудь подходящее по этой теме найду - напишу.
Отредактированно VladimirL (16.02.2010 13:24:36)
Неактивен
VladimirL,
http://depositfiles.com/files/09e27wuit у меня проблемы с этими сервисами, вечно пишет что с моего IP уже идет закачка
Раз уж тема об админках пошла, то спрошу - Есть ли в какой нибудь админке редактирование объектов в чисто текстовом виде?
Ну например имеем определение таблички:
CREATE TABLE t1(
f1 integer
)
меняем в тексте на:
CREATE TABLE t1(
f1 integer AUTO_INCREMENT NOT NULL PRIMARY KEY
)
нажимаем сохранить и админка генерирует следующий скрипт:
ALTER TABLE t1
MODIFY f1 int AUTO_INCREMENT NOT NULL PRIMARY KEY
Хочу встроить такой редактор в отладчик
Неактивен
Нашел хороший ориентир - бесплатный аналог MySQL Front. Называется HeidiSQL. Доступны исходники, что также может помочь при написании своих программ. Давно хотел увидеть исходники для экспорта таблиц
Страница загрузки http://www.heidisql.com/download.php , откуда можно загрузить и исходный код.
По первым наблюдениям багов в нем меньше чем у MySQL Front, и похоже, что Unicode использует - кириллица в названиях объектов работает на ура. Как работает просмотр данных больших таблиц еще не проверял, но при просмотре пустых таблиц все время выдает Access violation.
Удаление записей этот клиент производит с учетом типов полей, так что думаю этот вопрос можно считать закрытым. Единственное замечание по-поводу удаления записей - это то, что как и другие клиенты позволяет удаление только по главному ключу. Хотя могла бы быть реализована функция удаления определенного числа записей по значениям в указанных полях.
byterus,
Добавил ссылку на скачивание с files.mail если что.
Отладчик у Вас красивый и удобный, ошибок пока не выдавал. Но цена кусачая для массового российского пользователя ))
Насколько понял, код процедуры всегда надо копировать вручную на вкладку Main. Если так, то для удобства можно было бы в контекстное меню процедур помимо "Open source" добавить, например, "Open in debug tab".
Что касается редактирования объектов, то насколько понимаю для встаивания в свою программу нужна даже не админка, а задокументированная DLL библиотека с такой функцией. Такие библиотеки мне неизвестны.
Если дело касается таблиц, то реализовать это в своей программе кажется несложным. Можно создать класс ОписаниеТаблицы, поля в котором - это общие совйства таблицы + массив объектов класса ОписаниеПоляТаблицы. По запросу SHOW CREATE TABLE получаем описание таблицы и из него заполняем объект класса ОписаниеТаблицы. Второй такой объект получаем из запроса типа CREATE TABLE заданного пользователем. А уже запрос ALTER TABLE легко построить путем сравнения этих двух объектов.
Аналогично можно дейстовать и при работе с БД.
Отредактированно VladimirL (17.02.2010 22:22:53)
Неактивен
VladimirL написал:
Добавил ссылку на скачивание с files.mail если что.
Скачал, думал по быстрому посмотреть, но программа оказалась совсем не маленькой Завтра буду подробней разбираться.
VladimirL написал:
Отладчик у Вас красивый и удобный, ошибок пока не выдавал. Но цена кусачая для массового российского пользователя ))
Насколько понял, код процедуры всегда надо копировать вручную на вкладку Main. Если так, то для удобства можно было бы в контекстное меню процедур помимо "Open source" добавить, например, "Open in debug tab".
Спасибо, цена для наших пользователей - написать на support@mydebugger.com с требованием ключика
Код процедуры копировать не нужно, во вкладке Main достаточно написать ее вызов, по поводу удобства вы правы, я уже делаю генерацию кода для вызова процедур\функций.
VladimirL написал:
Что касается редактирования объектов, то насколько понимаю для встаивания в свою программу нужна даже не админка, а задокументированная DLL библиотека с такой функцией. Такие библиотеки мне неизвестны.
Если дело касается таблиц, то реализовать это в своей программе кажется несложным. Можно создать класс ОписаниеТаблицы, поля в котором - это общие совйства таблицы + массив объектов класса ОписаниеПоляТаблицы. По запросу SHOW CREATE TABLE получаем описание таблицы и из него заполняем объект класса ОписаниеТаблицы. Второй такой объект получаем из запроса типа CREATE TABLE заданного пользователем. А уже запрос ALTER TABLE легко построить путем сравнения этих двух объектов.
Аналогично можно дейстовать и при работе с БД.
Я не совсем понял по поводу библиотек, а в остальном вы абсолютно правы, вот только вопрос, почему эта реализация не стала популярной? Подводных камней в реализации конечно достаточно, но и удобство редактирования очевидно.
Неактивен
VladimirL,
SQL Request дублируется на вкладках Manage XXX, так и должно быть? Интерфейс перегружен функциональными элементами и не стандартными ходами (например кнопки растянуты по ширине фрейма, списки сами собой исчезают). Create table\user имхо должно быть действием (открытие модального окна), а не вкладкой с которой можно в любой момент уйти. Не нашел модуля SQL Script. Ну и так по мелочи, Warring=Warning:)
Вы можете сказать какие модули конкретно нужно протестировать?
Неактивен
byterus написал:
SQL Request дублируется на вкладках Manage XXX, так и должно быть?
Так и задумывал. Когда пользователь не подключен к какой-то конкретной базе, запрос должен выполняться исходя из этого. То есть запрос можно составить к любой базе, но всегда необходимо явно указывать имя этой БД. Для этого на панели вставки имен элементов СУБД есть колонка с именами баз данных.
На вкладке написания запроса к конкретной БД колонки с именами БД нет. Есть таблицы и поля. Аналогично все сделано на вкладке написания запроса к конкретной таблице.
byterus написал:
Интерфейс перегружен функциональными элементами
Буду благодарен совету по поводу интерфейса. В чем именно выражается перегруженность?
Мне показалось, что в процессе написания запроса к БД будет удобно, если можно будет вставлять дату, время и момент времени через диалоговое окно. Также показалась удобной функция вставки в текст запроса сигнатуры хранимой функции или процедуры - затем для ее вызова достаточно подставить нужные параметры.
Если кнопки действительно неудобны, то будет ли лучше, если это будет делаться через контекстное меню текстовой области с запросом?
И если перегруженность на других вкладках, то что стоит убрать без нарушения функционала?
byterus написал:
не стандартными ходами (например кнопки растянуты по ширине фрейма, списки сами собой исчезают)
Замечание обязательно учту и добавлю в настройки интерфейса программы отключение такого поведения списков и кнопок.
Вообще списки исчезают сами только при подключении к БД и при создании таблицы. Сделал это исходя из следующих рассуждений. База данных - довольно самостоятельный объект. Когда пользователь подключается к конкретной БД, то вероятнее всего у него не будет необходимости в ближайшее время подключаться и к другой БД. Место на экране лучше освободить для функциональных элементов.
Аналогично при создании новой таблицы количество элементов в окне очень велико и лучше скрыть список других таблиц, чтобы освободить место для более удобного создания таблицы.
byterus написал:
Create table\user имхо должно быть действием (открытие модального окна), а не вкладкой с которой можно в любой момент уйти.
ИМХО модальные окна - зло и их надо использовать как можно меньше. Думаю потом и процесс создания БД вынести из модального окна на вкладку или не модальное окно.
В момент создания пользователя или базы данных может потребоваться узнать какие-нибудь данные в базе, тогда модальное окно очень мешает. Есть и другие причины так к ним относиться.
byterus написал:
Не нашел модуля SQL Script.
Стоит поработать над этой функцией?
byterus написал:
Вы можете сказать какие модули конкретно нужно протестировать?
Пока наверное никакие.
В данный момент меня интересовало только удаление записей и их добавление в таблицу - добавляю сейчас эти функции в программу.
Но за замечания по поводу интерфейса спасибо.
Неактивен
VladimirL написал:
Так и задумывал. Когда пользователь не подключен к какой-то конкретной базе, запрос должен выполняться исходя из этого. То есть запрос можно составить к любой базе, но всегда необходимо явно указывать имя этой БД. Для этого на панели вставки имен элементов СУБД есть колонка с именами баз данных.
На вкладке написания запроса к конкретной БД колонки с именами БД нет. Есть таблицы и поля. Аналогично все сделано на вкладке написания запроса к конкретной таблице.
Уловил логику, мне кажется что дерево базы\таблицы\поля рядом с редактором было бы не менее удобным, зато редактор был бы один.
VladimirL написал:
В чем именно выражается перегруженность?
Много элементов, подробно сказать не могу, можно обсудить отдельно какой-нибудь модуль.
VladimirL написал:
ИМХО модальные окна - зло и их надо использовать как можно меньше.
Ну, не модальные, но отдельные, не вкладки.
VladimirL написал:
В данный момент меня интересовало только удаление записей и их добавление в таблицу - добавляю сейчас эти функции в программу.
Ага, точно, с этого же и начинали, совершенно забыл, простите:)
Неактивен
Еще раз спасибо за уделенное время. Приму во внимание все замечания и что-нибудь подкручу
Неактивен