mysql - запрос для всех баз данных [duplicate]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
5
задан WonderLand 10 January 2014 в 12:32
поделиться

4 ответа

  SELECT DISTINCT SCHEMA_NAME AS `database`
    FROM information_schema.SCHEMATA
   WHERE  SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql')
   ORDER BY SCHEMA_NAME

предоставляет вам список всех баз данных, отличных от MYSQL, в вашей системе.

  SELECT TABLE_SCHEMA AS `database`,
         TABLE_NAME AS `table`
    FROM information_schema.TABLES
   WHERE TABLE_TYPE = 'BASE TABLE'
   ORDER BY TABLE_SCHEMA, TABLE_NAME

предоставляет вам список всех фактических таблиц (за исключением SYSTEM VIEWs, таких как таблица TABLES , и пользовательские представления) во всех базах данных.

Затем вы должны реализовать логику в своей программе, чтобы гарантировать, что для каждой базы данных это действительно база данных Magento, прежде чем вы обрезаете определенные таблицы. В противном случае вы можете стать презираемым человеком среди своих сотрудников. : -)

Редактировать

Вот хранимая процедура.

Вам нужно отредактировать его, чтобы сделать именно то, что вам нужно для этого; в частности, он подсчитывает строки, а не усекает таблицы, и не содержит правильный список журнальных таблиц. (Было бы безответственно для меня опубликовать такую ​​дико разрушительную хранимую процедуру, вы должны отредактировать ее сами, чтобы сделать деструктивную часть.)

DELIMITER $$
DROP PROCEDURE IF EXISTS `zap_magento_logs`$$

CREATE PROCEDURE `zap_magento_logs`()
BEGIN

    -- declare variables for database and table names
    DECLARE dbname VARCHAR(128) DEFAULT '';
    DECLARE tbname VARCHAR(128) DEFAULT '';

    DECLARE done INTEGER DEFAULT 0;

    -- declare cursor for list of log tables
    DECLARE log_table_list CURSOR FOR 
      SELECT TABLE_SCHEMA AS `database`,
             TABLE_NAME AS `table`
        FROM `information_schema`.TABLES
       WHERE TABLE_TYPE = 'BASE TABLE'
         AND TABLE_NAME IN 
         (
            'log_customer',
        'log_visitor',
        'log_visitor_info',
        'log_url',
        'log_url_info',
        'log_quote'
         )
       ORDER BY TABLE_SCHEMA, TABLE_NAME;

    -- declare NOT FOUND handler
        DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET done = 1;

    OPEN log_table_list;

    log_table: LOOP

        FETCH log_table_list INTO dbname, tbname;

        IF done = 1 THEN
        LEAVE log_table;
        END IF;

        -- create an appropriate text string for a DDL or other SQL statement
        SET @s = CONCAT('SELECT COUNT(*) AS num FROM  ',dbname,'.',tbname);
        PREPARE stmt FROM @s;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt; 
    END LOOP    log_table;
    CLOSE log_table_list;

END$$

DELIMITER ;

Вы запустили это, выпустив команду SQL

  CALL zap_magento_logs();
9
ответ дан O. Jones 19 August 2018 в 01:35
поделиться
  • 1
    вы можете расширить свой ответ ... что я должен сделать в этот момент? как выполнить цикл по всему результату, обрезать нужные таблицы? это моя местная развитая среда :) – WonderLand 28 December 2013 в 19:19
  • 2
    # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «database FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME LIMIT 0» в строке 1 – underscore 28 December 2013 в 19:19
  • 3
    @WonderLand Все, что вы пишете, может превратить его в производство! – O. Jones 28 December 2013 в 19:20
  • 4
    @samitha oops, забыл избежать зарезервированных слов. Исправлена. Благодарю. – O. Jones 28 December 2013 в 19:22
  • 5
    Хорошо, хорошо, вот хранимая процедура. Я стесняюсь дать вам это, потому что он содержит несколько уровней концепций MySQL, с которыми вы, возможно, не знакомы, и я не сторонник просто обучения людей «волшебным заклинаниям». – O. Jones 28 December 2013 в 20:28

Мне не хотелось писать код, чтобы решить эту проблему, поэтому я нашел другое решение. Я написал SQL, который генерирует SQL, который мне нужен. Поэтому я сохранил следующее в файле с именем createSomeSQL.sql:

SET sql_mode='PIPES_AS_CONCAT';

select 
'truncate table ' || dbs.database || '.someLogTable;'
 as ''
from  (SELECT DISTINCT SCHEMA_NAME AS `database`
         FROM information_schema.SCHEMATA
        WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'test')
        ORDER BY SCHEMA_NAME) as dbs;

Вы можете заменить SQL в строке 4 тем, что хотите. Затем я запустил эту команду для генерации SQL, который мне нужен:

mysql -u root -p < createSomeSQL.sql > sqlToExecute.sql

Замените «root» своим именем пользователя, конечно. Теперь файл sqlToExecute.sql содержит скрипт, который вы можете запустить для выполнения этого SQL для всех ваших баз данных.

2
ответ дан Ryan Shillington 19 August 2018 в 01:35
поделиться
  • 1
    Я думаю, что это самый простой ответ и самый лучший! – budiantoip 18 December 2017 в 09:28
  • 2
    У каждого клиента есть идентичная база данных. Используя сценарий Райана в качестве основы, мы добавили учетные записи пользователей с привилегиями, используя SELECT CONCAT("GRANT DELETE,INSERT,SELECT,UPDATE ON `",TABLE_SCHEMA, "`.* TO 'someuser'@'%';") FROM information_schema.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'a_table_in_all_similar_databases' ORDER BY TABLE_SCHEMA ; – PeteW 2 January 2018 в 14:52

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

$db = mysqli_connect(); // your database connection

$tables = ["log_customer", "log_visitor", "log_visitor_info"]; // array with all the tables

foreach ($tables as $table) {
    mysqli_query($db, "TRUNCATE TABLE `".$table."`"); // executes query for each element in the array
}
1
ответ дан user 19 August 2018 в 01:35
поделиться

Подход PHP:

$tables = array(
    'log_customer',
    'log_visitor',
    'log_visitor_info',
    'log_url',
    'log_url_info',
    'log_quote',
    'report_viewed_product_index',
    'report_compared_product_index',
    'report_event',
    'catalog_compare_item',
);

$dbh = new PDO('mysql:host=localhost;', 'USERNAME', 'PASSWORD', array(
    PDO::ATTR_PERSISTENT => true
));


$sql = $dbh->query('SHOW DATABASES');
$getAllDbs = $sql->fetchALL(PDO::FETCH_ASSOC);

foreach ($getAllDbs as $DB) {  

        foreach ($tables as $table) {
            $dbh->query('TRUNCATE TABLE ' . $DB['Database'] . '.' . $table);

    };
};
4
ответ дан WonderLand 19 August 2018 в 01:35
поделиться
  • 1
    наконец, это проще и быстрее – WonderLand 28 December 2013 в 20:52
  • 2
    ohh Cool.Yeah.Я делаю это с 45 базами данных моего сервера. Пожалуйста, примите ответ :) – underscore 28 December 2013 в 20:57
Другие вопросы по тегам:

Похожие вопросы: