Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3 4 ... 7   Вниз
  Печать  
Автор Тема: Всякие вопросы по MySQL 5.0+  (Прочитано 132644 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 30-09-2009 11:46 » 

как сделать проверку на наличие поля - интересует наибыстрейший способ, не возвращающий результата запроса (или минимум)

?
пока сделано так

select COUNT(field) from table

если ошибка, то поля нет
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 30-09-2009 12:05 » 

Алексей1153++, ещё раз, мысль: любой ДАК (Data Access Component) имеет средства для работы с метаданными своей СУБД. при инициализации большинство ДАК-ов вытаскивают большую часть этой инфы самостоятельно. и в большинстве случаев у ДАК-ов можно эту инфу опросить, не трогая СУБД вообще.

отсюда вопрос: на чём пишем? Си, Перл, ПХП?
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 30-09-2009 12:08 » 

з.ы. чисто в самом мускуле можно просто сказать:

Код:
SHOW COLUMNS 
FROM MyTable
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 30-09-2009 12:11 » 

даже, наверное, вот так прокатит:

Код:
show columns
from MyTable
like 'MyField'
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 30-09-2009 12:39 » 

SHOW DATABASES;
USE MyBase;
SHOW TABLES;
DESC MyTAble;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 01-10-2009 03:47 » 

x77, язык - с++ .

show columns from MyTable like 'MyField'
 - это работает, но не так, как хочется. Если поля нет, то запрос всё равно положительно выполняется, просто пустой результат получается.

А надо такой запрос, чтобы при выполнении:
1) если поле есть, был результат true, а зам запрос не должен возвращать много данных (я их всё равно не читаю)
2) если поля нет , был результат false (ошибка во время выполнения SQL-запроса)

зы пока сделаю извлечение результата запроса с проверкой на пустоту и всё засуну в отдельную функцию проверки наличия поля
« Последнее редактирование: 01-10-2009 04:13 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 01-10-2009 04:12 » 

наткнулся на странную надпись в мануале:
Цитата
Функцию mysql_store_result() или mysql_use_result() необходимо вызывать после каждого выполненного запроса, извлекающего данные (SELECT, SHOW, DESCRIBE, EXPLAIN).
следует ли понимать букватьно - что прям вот необходимо вызывать обязательно после запроса, или же только когда я действительно хочу прочитать результат запроса ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 01-10-2009 06:09 » 

что за загадка такая

Код:
	CString sql;
sql.Format("show columns from %s like '%s'",tbl,field);

MYSQL_RES* pR=0;
MYSQL_ROW row=0;
int num_fields=0;
unsigned long* lengths=0;
pR=mysql_use_result(m_pCONN);
if(pR)
{
num_fields=mysql_num_fields(pR);


значение num_fields == 6  , почему ? Хотя в результате запроса всего одна колонка возвращается


----------------

ещё не могу понять, как из результата вытащить значение поля по имени поля
« Последнее редактирование: 01-10-2009 06:26 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 01-10-2009 06:57 » 

сделал так
MYSQL_FIELD* flds=mysql_fetch_fields(pR)

про число 6 тоже понятно стало, я же выбираю из какой то системной таблицы  (SHOW ...) , там описание поля
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 07-10-2009 03:53 » 

как в MySQL обеспечить, чтоб в таблице была максимум только одна запись ?

мысль такая - создать уникальный ключ и всегда жёстко записывать в него одно и то же значение, пойдёт такое решение ?
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #10 : 07-10-2009 04:38 » 

если есть в MySQL констрейты, то я бы создал лучше его, в котором и проверял бы кол-во записей в таблице
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 07-10-2009 04:48 » 

констрейты - это что за зверь и как его едят ?
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #12 : 07-10-2009 05:18 » 

что-то типа этого
Код:
CREATE TABLE test(  Id INTEGER,  Data INTEGER  CHECK (Id=Data));

правда говорят, что клнстрэйнт CHECK не поддерживается в MySQL, хотя и присутствует
надо тестировать
Записан

I Have Nine Lives You Have One Only
THINK!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 07-10-2009 05:21 » 

1)
не могу понять, что мне даст
CHECK (Id=Data)


2) ещё вопрос: мне нужно корректировать структуру базы, как перед этим убедиться, что к базе никто не подключен, чтоб не было накладок ?
Записан

HandKot
Молодой специалист

ru
Offline Offline

« Ответ #14 : 07-10-2009 05:33 » 

это был пример
тут посмотрел, оказывается в констрэйнтах не поддерживаются подзапросы

тогда можно с тригерами поигратся
Записан

I Have Nine Lives You Have One Only
THINK!
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 07-10-2009 05:35 » 

Нету такого.

Леш, невозможно ограничить. Только как ты сказал - используя одно и тоже значение для PK.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 07-10-2009 05:36 » 

понятно. А что насчёт определения доступа ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 07-10-2009 06:07 » 

Запретить доступ можно несколькими способами:

1. Сменить TCP порт, рестартовать сервер, сделать черное дело, вернуть старый порт и еще раз рестартовать. Это совершенно не помогает, если коннект через Unix-сокет или Windows-pipe.

2. Сохранить права пользователя, которого нужно заблокировать. Снять с него все права, а после вернуть на место.

SHOW GRANTS FOR 'user'@'host';
REVOKE ALL ON dbname.* FROM 'user'@'host';

3. Переименовать пользователя.

RENAME USER 'user'@'host' TO 'other_user'@'other_host';
« Последнее редактирование: 07-10-2009 06:09 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 07-10-2009 06:15 » 

Цитата
3. Переименовать пользователя.

RENAME USER 'user'@'host' TO 'other_user'@'other_host';
заинтересовало )) попробую

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 07-10-2009 06:25 » 

не нашёл такой команды -
RENAME USER
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 07-10-2009 06:39 » 

Цитата
12.5.1.4. RENAME USER Syntax
RENAME USER old_user TO new_user
[, old_user TO new_user] ...

The RENAME USER statement renames existing MySQL accounts. To use it, you must have the global CREATE USER privilege or the UPDATE privilege for the mysql database. An error occurs if any old account does not exist or any new account exists. Each account is named using the same format as for the GRANT statement; for example, 'jeffrey'@'localhost'. If you specify only the username part of the account name, a hostname part of '%' is used. For additional information about specifying account names, see Section 12.5.1.3, “GRANT Syntax”.

RENAME USER does not automatically migrate any database objects that the user created, nor does it migrate any privileges that
the user had prior to the renaming. This applies to tables, views, stored routines, and triggers.

The RENAME USER statement was added in MySQL 5.0.2.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 07-10-2009 06:58 » 

Код:
RENAME USER 'root@localhost' TO 'root_correct@localhost'


происходит ругань
Operation RENAME USER failed for 'root@localhost'

или из под самого root нельзя переименоваться ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 07-10-2009 07:03 » 

Леха, внимательнее надо!

'root'@'localhost'

Только ты потом хрен что сделаешь, если у тебя нет в БД другого пользователя с GRANT OPTIONS и имеющего все права.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 07-10-2009 07:23 » 

гы, намёк понял ))

Всё получилось, спасибо. Того, что потеряется пользователь, не боюсь - я после корректировки возвращаю root , а если что, делаю бекап, который сохранил перед началом корректировки
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 07-10-2009 07:47 » 

если под root уже кто то подключен, то после переименования он уже ничего сделать не сможет ? Хотя, как это не сможет - я же сам и делаю действия дальше ...  Тогда это всё не решает проблему
« Последнее редактирование: 07-10-2009 07:55 от Алексей1153++ » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 07-10-2009 08:57 » 

Алексей1153++, затрудняюсь с ответом. Проверь экспериментально.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 07-10-2009 09:24 » 

эксперемент показывает, что после переименования я спокойно продолжаю вносить корректировки в структуру Улыбаюсь)

В общем, буду юзерам окно показывать - "чё-то где-то занято, разбирайтесь сами и запускайте снова" Улыбаюсь
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 07-10-2009 09:29 » 

Ага Ага Типа перегрузитесь, а если не поможет - обращайтесь. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 07-10-2009 09:34 » 

а ибо нефиг Улыбаюсь
с птицей было попроще - там один файл, пожно попробовать открыть файл для эксклюзивного использования, и сразу было понятно, занят он или нет
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 07-10-2009 09:52 » 

Все таки ПО не должно работать в момент обновления структуры базы. Т.ч. не столь важно, как ты его на время выведешь из строя. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1] 2 3 4 ... 7   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines