Архив

Публикации с меткой ‘mysql’

Импорт mysql дампа средствами php

26 Апрель 2013 Нет комментариев

В моем примере база была InnoDB, поэтому пример привожу с ее фишками:

//читаем файл с дампом
$str = file_get_contents("dump.sql");

//если есть CREATE TABLE, тогда создаем таблицы
if( preg_match_all("/\-\- Table.*?\s\-\-\s(.*?)\-\-/s", $str, $p) ) {
$er = false;
foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//если есть инсерты, инсертим ;)
if(preg_match_all("/\-\- Dumping data.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

//создаем связи между таблицами
if(preg_match_all("/\-\- Constraints.*?\s\-\-\s(.*?)\-\-/s", $str, $p)) <span style="font-size: 13px;">{</span>

foreach( $p[1] as $v ) {

if( trim($v) != '' ) {

if(!mysql_query(trim($v), $link)) {

echo '<strong style="color: red;">Ошибка запроса:'.$v.'</strong>';

$er = true;

}

}

}

}

if( $er !== false ) {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен.").'</strong>';
}
else {
echo '<strong style="color: green;">'.gettext("Дамп базы данных установлен с ошибками.").'</strong>';
}
Categories: Новости Tags: ,

Подсчет записей в базе данных для пагинатора

27 Август 2012 Нет комментариев

При создании пагинатора или вывода количества записей для данного запроса на странице обычно используется 2 одинаковых запроса SELECT. Первым запросом мы считаем общее кол-во записей, соот-щих данным условием SELECT COUNT(*)… , вторым запросом выдергиваем кол-во записей нужных для этой страницы, используя LIMIT. В итоге мы получаем два огромных медленных запроса. Есть решение как сделать все это действие 1 большим запросом и 1 маленьким:

SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE column > 1 LIMIT 0, 50;

Первым делаем наш запрос, что раньше шел вторым, т е тот что с лимитом, но добавляем в него SQL_CALC_FOUND_ROWS
Далее делаем запрос, который вернет общее кол-во записей, соот-щих условию предыдущего запроса, без учета LIMIT:
SELECT FOUND_ROWS();
Второй запрос должен выполняться сразу после первого.

Categories: Новости Tags:

INSERT UPDATE в одном флаконе. Часть 2.

27 Август 2012 Нет комментариев

В части 1 я уже описывал как делать 1 запрос вместо двух используя уникальный ключ, но что делать, когда такой ключ невозможен? Решение – это составной уникальный ключ из полей таблицы.

Например есть некая таблица, где хранятся значения дополнительных параметров для товара, в таблице tFieldValue есть поля:

valueId

value

fieldId – ключ, указывающий значение какого параметра храним

goodId – ключ, указывающий на товар.

Далее при сохранении карточки товара например у нас должны сохраняться и дополнительные параметры, т е надо сначало таблице tFieldValue проверить есть ли там значение для поля fieldId у товара goodId, если есть, то обновить поле value, если нет то добавить новую запись.

Чтобы решить эту задачу в 1 запрос в таблице tFieldValue из полей fieldId и goodId делаем 1 составной уникальный ключ, в phpmyadmin в структуре таблице выделяем эти два поля галочкой и нажимаем кнопку с уникальным ключом, либо запросом:

ALTER TABLE ` tFieldValue` ADD UNIQUE (

`fieldId` ,
`goodId`

);

Далее работаем с этой таблице как описано в части 1:

INSERT INTO `tFieldValue` (value,fieldId,goodId ) VALUES (‘8′, 120,1)
ON DUPLICATE KEY UPDATE value=’8′

Mysql будет искать запись в таблице tFieldValue с полем fieldId = 120 ,goodId=1, если найдет, то обновит value, если не найдет, тогда добавит новую запись.

Categories: Новости Tags:

Что делать, если имена таблиц mysql переводятся в нижний регистр в Windows

10 Февраль 2012 Нет комментариев

В настройках mysql в файле my.ini надо добавить строку lower_case_table_names=0, тогда таблицы начнут создаваться в нужном вам регистре. Подробнее можно прочитать тут: http://www.mysql.ru/docs/man/Name_case_sensitivity.html

Categories: Новости Tags: ,

INSERT UPDATE в одном флаконе

6 Октябрь 2009 3 comments

Довольно часто приходилось писать разного рода парсеры, например обновление товаров интернет-магазина из csv-файла. Вот при написание очередного такого творения столкнулся опять с затыком, который все-таки решил победить, а именно как одним запросом проверять есть ли товар в базе, если есть, то обновляем, если нет, то добавляем. В данном случае REPLACE не канает вообще, т к он при обновлении те ячейки, что трогать не надо, затирает нафиг. Делать в два запроса 1- проверка на наличие товара, 2 – добавляем/изменяем – это полный изврат, mysql.com ждет нас.

Курение манов на mysql.com привели к положительному результату уже на 15 минуте борьбы, все до отупения просто – нам поможет ON DUPLICATE KEY.

Итак приступим…

Дано:

Некая произвольная таблица с товарами

CREATE TABLE IF NOT EXISTS `tCatalogueGoods` (
`goodId` bigint(20) unsigned NOT NULL auto_increment,
`levelId` bigint(20) unsigned default ‘0’,
`goodName` varchar(255) default NULL,
`goodDescription` text,
`goodPrice` decimal(10,2) unsigned default ‘0.00’,
`goodCode` varchar(255) NOT NULL default ”,
PRIMARY KEY (`goodId`),
UNIQUE KEY `goodCode` (`goodCode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

goodCode – в данном случае артикул товара, поле уникальное, по нему и будем обновлять.

INSERT INTO `s1_tCatalogueGood` (`goodId`, `levelId`, `goodName`, `goodDescription`, `goodPrice`, `goodCode`,) VALUES
(1, 1, ‘товар1′, ‘описание товар1′, 10.00, ‘8’),
(2, 2, ‘товар2′, ‘описание товар2′, 11.00, ‘9’),
(3, 1 , ‘товар3′, ‘описание товар3′, 12.00, ’10’);

Далее самое вкусное, само решение:

INSERT INTO `tCatalogueGood` (goodCode, goodPrice) VALUES (‘8′, 120)
ON DUPLICATE KEY UPDATE goodPrice=120

Что происходит? Мускул если не находит совпадение по уникальному полю goodCode, тогда добавляет новую запись, если находит, то обновляет нужную ячейку в записи.

В общем вот так довольно просто решил давнюю проблему.

Categories: Новости Tags: