2015-02-02 2 views
0

У меня есть таблица в MySQL, которая обновляется каждую ночь с помощью задачи cron. Каждая строка изменяется, потому что я получаю данные из файла XLS и должен обновлять все значения.MySQL «UPSERT» и удалять не затронутые строки

Сначала я задал вопрос, стоит ли обновлять каждую строку или, с другой стороны, просто удалить все и вставить ее снова. Я придерживаюсь метода UPSERT, поскольку я читал, что он был более адекватным, быстрым и даже элегантным, который выбрасывал все данные, но, пожалуйста, исправьте меня, если я ошибаюсь.

ХОРОШО, так что теперь мой вопрос о строках, которые не новы и не обновляются каждый раз, когда работает cron. XLS, возможно, не имеет фиксированной длины, поэтому в один прекрасный день может быть несколько строк меньше ... или больше.

Как удалить эти строки в одном заявлении «UPSERT»?

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

ответ

1

Поскольку все строки обновляются каждый раз, когда & у вас нет возможности проверить строки без изменений? Как насчет того, чтобы просто обрезать & навалом вставить все?

+0

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

+0

Это не общий сценарий. Если вам не нужны старые данные, то почему вы беспокоитесь о доступности данных. Нет стандартных способов, с помощью которых вы можете идентифицировать несоответствующие данные в таблице из одного файла при выполнении операции upsert. Если вам не нужны старые данные (нет в данном файле), то в чем смысл хранить эти данные. –

+0

Я не хочу хранить старые данные (мой вопрос о том, как удалить его). Итак, вкратце вы считаете, что в этом случае операция удаления-все/вставить все будет лучше? – Alberto

0

Даже лучше, чем DROPping или TRUNCATE, является следующее. Это связано с тем, что существует нулевое время простоя.

CREATE TABLE new LIKE real; 
LOAD DATA or otherwise do bulk INSERT into `new` 
RENAME TABLE real TO old, new TO real; 
DROP TABLE old; 

Я хотел бы передать на old пока у меня есть шанс, чтобы проверить, что основная нагрузка не как-то лоха и рыхлое все.

Единственный раз, когда таблица заблокирована во время RENAME, но это так быстро, я говорю «нулевое время простоя».

Смежные вопросы