Хранимая процедура MySQL для INSERT DELAYED, но сначала CREATE TABLE, если необходимо? - PullRequest
0 голосов
/ 16 июня 2010

Я планирую сделать много INSERT DELAYED в MyISAM таблиц.Но таблицы могут еще не существовать.Допустим, например, что для каждого дня будет существовать новая таблица.

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

Возможно ли это и как это будет выглядеть?Есть ли недостатки этого подхода?

Ответы [ 3 ]

1 голос
/ 20 июня 2010

Не было бы идеей создать запланированное событие, которое будет проходить каждую ночь до полуночи, и создать таблицу журнала на следующий день.Таким образом, вы всегда можете положиться на таблицу, созданную до того, как произойдет какое-либо INSERT?

CREATE EVENT createLogTable
ON SCHEDULE EVERY 1 DAY  
STARTS '2010-6-20 23:59:00'   
DO
    BEGIN
        SET @tablename = CONCAT('my_logging_table-',DATE(DATE_ADD(NOW(),INTERVAL 1 DAY)));
        SET @query = CONCAT('CREATE TABLE IF NOT EXISTS`',@tablename,'` (`timestamp` INT,`event` VARCHAR( 20 )) ENGINE = MYISAM');
        PREPARE createStatement FROM @query;
        EXECUTE createStatement;
        DEALLOCATE PREPARE createStatement;
    END
1 голос
/ 16 июня 2010

Кажется, что при каждой вставке проверять, существует ли таблица, - пустая трата времени. Если вам нужны таблицы изо дня в день (по моему мнению, они не поддаются большей части логики, обычно встречающейся в базах данных, поэтому я стараюсь их избегать):

  1. Создайте таблицу по умолчанию для вставки «my_logging_table».
  2. Делать все вставки / обновления / удаления в этой таблице.
  3. Запустите ежедневный cronjob для создания таблицы вчерашнего дня ('my_logging_table-2010-06-15') и вставьте в нее все записи вчерашних дней, после чего они будут удалены из основной таблицы.
  4. Если это большая часть переписывания для вашего приложения, вы можете создать обновляемое представление с текущим именем таблицы + день ('my_logging_table-2010-06-16'), которое просто вставляется в 'my_logging_table'

Другим подходом может быть таблица MERGE (см. http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html), с ежедневным хронологическим созданием таблицы 'today' и обновлением списка таблиц для таблицы слияния с помощью оператора alter table.

0 голосов
/ 17 июня 2010

Вы можете создать хорошую схему для достижения того же.

Например, если у вас есть таблица "Logged_users", которая будет создаваться каждый день, вы можете просто добавить столбец в таблицу пользователей,или создайте дополнительную таблицу со столбцами ID_USER, DAY (это было бы лучшим выбором).Затем вы можете запрограммировать задание CRON на удаление всех строк прошлых дней и выполнять это задание каждый день в 12:00.

...