Ответы пользователя по тегу MySQL
  • Как определить в NULL значение переменной в MySQL?

    vman
    @vman
    DROP PROCEDURE IF EXISTS t1;
    DELIMITER //
    CREATE PROCEDURE t1 ()
    BEGIN
    	DECLARE e, w, s, n INT;
        SELECT 1 INTO e;
        SELECT 2 INTO w;
        SELECT 3 INTO s;
        SELECT 4 INTO n;
        SET e = w = s = n = NULL;
        SELECT e,w,s,n;
    END//
    DELIMITER ;
    
    DROP PROCEDURE IF EXISTS t2;
    DELIMITER //
    CREATE PROCEDURE t2 ()
    BEGIN
    	DECLARE e, w, s, n INT;
        SELECT 1 INTO e;
        SELECT 2 INTO w;
        SELECT 3 INTO s;
        SELECT 4 INTO n;
        SET e = NULL;
        SET w = NULL;
        SET s = NULL;
        SET n = NULL;
        SELECT e,w,s,n;
    END//
    DELIMITER ;
    
    CALL t1();
    CALL t2();
    
    +------+------+------+------+
    | e    | w    | s    | n    |
    +------+------+------+------+
    | NULL |    2 |    3 |    4 |
    +------+------+------+------+
    
    +------+------+------+------+
    | e    | w    | s    | n    |
    +------+------+------+------+
    | NULL | NULL | NULL | NULL |
    +------+------+------+------+
    Ответ написан
    Комментировать
  • Как извлечь JSON объект из массива?

    vman
    @vman
    я вот только до такого додумался

    select * from t;
    +-------------------------------------------------------------------------+
    | u                                                                       |
    +-------------------------------------------------------------------------+
    | [{"name": "Tomas", "user_id": "52"}, {"name": "John", "user_id": "59"}] |
    +-------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    SELECT JSON_EXTRACT(u, REPLACE(REPLACE(JSON_SEARCH(u, 'one', '52'), 'user_id', 'name'), '"', '')) FROM t;
    +--------------------------------------------------------------------------------------------+
    | JSON_EXTRACT(u, REPLACE(REPLACE(JSON_SEARCH(u, 'one', '52'), 'user_id', 'name'), '"', '')) |
    +--------------------------------------------------------------------------------------------+
    | "Tomas"                                                                                    |
    +--------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    Ответ написан
    Комментировать
  • Как очистить бд от дублей?

    vman
    @vman
    надо создать уникальный индекс по тем полям, в которых есть дубликаты
    ALTER IGNORE TABLE <table_name> ADD UNIQUE KEY (<name>,<name>);

    замените в этом запросе на имя вашей таблицы, и поля на необходимые вам поля
    Ответ написан
  • Изучаю базы данных. В уроках используется MySQL. Можно ли заменить его на PostgreSQL без потери совместимости?

    vman
    @vman
    Если быть точным то вот ссылки на стандарты которые поддерживаются БД

    https://dev.mysql.com/doc/refman/8.0/en/compatibil...
    https://www.postgresql.org/docs/current/features.html

    Скорей всего столкнетесь с разным способом конкатенации строк, функциями (даты, строки, итд). По разному создаются БД, таблицы, индексы, представления (view) итд.

    Как я написал в комментариях, выполняйте задачи параллельно, получите хороший опыт.
    Ответ написан
    Комментировать
  • При смене версий PHP вырастает нагрузка на диск, что делать?

    vman
    @vman
    включить кеширование схемы в Yii2, иначе Yii2 делает много доп. запросов

    'db' => [
    .....
        'enableSchemaCache' => true,
        'schemaCacheDuration' => 3600,
        'schemaCache' => 'cache',
    ]


    по тюнингу БД

    1) уменьшить query_cache_size до 64M (были проблемы при большом кеше)

    прочитать про эти два параметра и выбрать режимы

    innodb_flush_method                  = O_DSYNC
    innodb_flush_log_at_trx_commit = 0
    Ответ написан
    3 комментария
  • Как оптимизировать SQL-запросы?

    vman
    @vman
    На примере

    $result = $dbh->query("SELECT id FROM test.news LIMIT 3")->fetchAll(PDO::FETCH_ASSOC);
    
    // получили из БД список ID
    // +-----+
    // | id  |
    // +-----+
    // | 100 |
    // | 101 |
    // | 102 |
    // +-----+
    $exist  = [];
    
    // делаем массив у которого ключ = ID, а значение = true
    foreach ($result as $row) {
        $exist[$row['id']] = true;
    }
    
    // массив новостей
    $news = [
        [ "id" => 102 , "titile" => "news title", "text" => "news text" ],
        [ "id" => 1001, "titile" => "news title", "text" => "news text" ]
    ];
    
    // проходим по каждому элементу массива с новостями
    foreach ($news as $key => $item) {
    
        // проверяем если ли в БД новость с таким ID
        if (isset($exist[$item['id']]) && $exist[$item['id']] === true) {
    
            // если такой новости нет - удаляем из массива с новостями
            unset($news[$key]);
        }
    }


    после фильтрации в новостях останется только новость с ID = 1001, ее и вставляем в БД.

    Можно пойти другим путем, если ID новости является PK, или имеет уникальный ключ, то можно просто вставлять все новости игнорируя ошибки

    INSERT INTO ..... ON DUPLICATE KEY UPDATE updated_at = NOW()


    вставляем запись и если она уже была, обновим поле updated_at
    Ответ написан
    1 комментарий
  • Как составить SQL-запрос?

    vman
    @vman
    Для MySQL версии 5.6, 5.7 можно сделать вот так

    CREATE DATABASE test;
    use test;
    
    CREATE TABLE t (a varchar(255), b varchar(255));
    
    -- повесим триггер на INSERT 
    -- триггер будет брать значение из "...." и вставлять его в поле 'b'
    
    CREATE TRIGGER before_insert_test_t
    BEFORE INSERT ON test.t 
    FOR EACH ROW 
      SET new.b = SUBSTRING_INDEX(SUBSTRING_INDEX(new.a, '"', 2), '"', -1);
    
    INSERT INTO t (a) VALUES('text text "QWERTY" text text');
    SELECT * FROM t;
    
    +------------------------------+--------+
    | a                            | b      |
    +------------------------------+--------+
    | text text "QWERTY" text text | QWERTY |
    +------------------------------+--------+


    в 8 версии MySQL, можно сделать так

    CREATE TABLE t 
    (
      a varchar(255), 
      b varchar(255) default (SUBSTRING_INDEX(SUBSTRING_INDEX(a, '"', 2), '"', -1);)
    );


    но я это не проверял, 8-й версии у меня нет.
    Ответ написан
    Комментировать
  • MySQL (Percona XtreDB Cluster) - как правильно осуществлять ротацию логов?

    vman
    @vman
    /var/lib/mysql/mysqld.log {
        .....
        postrotate
            if test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin ping &>/dev/null
            then
                /usr/bin/mysqladmin flush-logs
            fi
        endscript
    }
    Ответ написан
    1 комментарий
  • Как в mysql сделать запрос с учёток регистра?

    vman
    @vman
    Если кратко - то да, можно. Все зависит от кодировки и методе сортировки установленных для таблицы (и колонки) по которой необходимо произвести поиск.

    Пара примеров

    select User from mysql.user where User = 'Root'
    Empty set (0.00 sec)
    
    select User from mysql.user where User = 'Root' COLLATE utf8_general_ci;
    +------+
    | User |
    +------+
    | root |
    +------+
    
    select User from mysql.user where User = 'Root' COLLATE utf8_bin;
    Empty set (0.00 sec)


    Если для вашей таблицы выставлен COLLATE=utf8_general_ci, добавьте в запрос

    COLLATE utf8_bin;

    или поменяйте COLLATE на самой колонке.
    Ответ написан
    Комментировать
  • Как добавить новый текст в таблицу mysql не стирая старый?

    vman
    @vman
    Используя функцию CONCAT

    UPDATE table_name
    SET claim = CONCAT( claim, 'тут текст который надо добвить')
    WHERE ...
    Ответ написан
  • Выборка каждой через 5 строк, как организовать?

    vman
    @vman
    В 8 версии MySQL появилась встроенная функция ROW_NUMBER(), для 5.7 и ниже можно использовать вот такой вариант

    create table t (
    	name  varchar(255),
    	value varchar(255)
    );
    
    insert into t values('name1', 'value1');
    insert into t values('name2', 'value2');
    insert into t values('name3', 'value3');
    insert into t values('name4', 'value4');
    insert into t values('name5', 'value5');
    insert into t values('name6', 'value6');
    insert into t values('name7', 'value7');
    insert into t values('name8', 'value8');
    insert into t values('name9', 'value9');
    insert into t values('name10', 'value10');
    insert into t values('name11', 'value11');
    insert into t values('name12', 'value12');
    insert into t values('name13', 'value13');
    insert into t values('name14', 'value14');
    insert into t values('name15', 'value15');
    
    -- каждый 5-й
    SELECT 
    	num, name, value 
    FROM (
    	SELECT (@RN:=@RN+1) AS num, name, value 
    	FROM t, (SELECT @RN:=0) AS t
    ) as d 
    WHERE num % 5 = 0;
    
    +------+--------+---------+
    | num  | name   | value   |
    +------+--------+---------+
    |    5 | name5  | value5  |
    |   10 | name10 | value10 |
    |   15 | name15 | value15 |
    +------+--------+---------+
    
    -- каждый 3-й
    SELECT 
    	num, name, value 
    FROM (
    	SELECT (@RN:=@RN+1) AS num, name, value 
    	FROM t, (SELECT @RN:=0) AS t
    ) as d 
    WHERE num % 3 = 0;
    
    +------+--------+---------+
    | num  | name   | value   |
    +------+--------+---------+
    |    3 | name3  | value3  |
    |    6 | name6  | value6  |
    |    9 | name9  | value9  |
    |   12 | name12 | value12 |
    |   15 | name15 | value15 |
    +------+--------+---------+


    Это решение не зависит от колонки ID и удаленных элементов.
    Ответ написан
    Комментировать
  • Какие поля приходят?

    vman
    @vman
    Делается это очень просто, создаете таблицу params (id int, name varchar(255), value varchar(255))
    После сохранения обязательных полей в таблицу (к примеру items) получаете id (из таблицы items), и пишете в таблицу params все значения которые пользователь создал, связав их с формой (items) через id.
    Ответ написан
    Комментировать
  • Как сменить пароль root в MySQL 5.7.22?

    vman
    @vman
    нет там никаких глюков :)
    если старый пароль известен, то проще сделать это через
    mysqladmin password

    если пароль не известен
    1) останавливаем mysql
    2) запускаем вручную mysqld_safe --skip-grant-tables
    3) подключаемся в консоль
    4)
    UPDATE mysql.user SET authentication_string = PASSWORD('*****') WHERE User = 'root' AND Host = 'localhost';

    5) выходим
    6) останавливаем текущий сервер
    7) запускаем основной
    Ответ написан
    2 комментария
  • Как быстро скопировать таблицу с MSSQL в MySQL?

    vman
    @vman
    я бы попробовал 2 варианта:

    1) сделать наподобие репликации через триггеры на site_db.client_list_sync
    при insert|update делать через OPENQUERY DELETE + INSERT
    при delete соответственно удалять. Это просто идея, так как я не знаю точно может ли MSSQL такое позволить.

    2) выгрузка таблицы в файл, копирование её на сервер и загрузка данных через LOAD DATA

    п.2 наверно, все равно придется реализовать, так как гарантировать целостность при подходе из п.1 нельзя.
    Ответ написан
    Комментировать
  • Не стартует mysql (CentOS 6.7)?

    vman
    @vman
    запусти его в ручную из консоли mysqld и посмотри что напишет
    Ответ написан
  • MySQL 5.7 LOAD DATA INFILE проблема с кирилицей решение?

    vman
    @vman
    1) данные в файле в какой кодировке?
    2) таблица и её текстовые поля в какой кодировке?
    Ответ написан
  • Как объединить несколько таблиц в MuSQL?

    vman
    @vman
    очевидно добавить в запрос join C on B.страна = C.страна
    Ответ написан
    Комментировать