Чтобы получить все элементы формы:
$.each($('form').serializeArray(), function(index, value){
$('[name="' + value.name + '"]').attr('readonly', 'readonly');
});
Я не могу говорить о MySQL, но PostgreSQL имеет транзакционный DDL. Это замечательная функция, и это означает, что ваш второй вариант, загрузка новых данных в фиктивную таблицу и затем выполнение переименования таблицы, должен работать отлично. Если вы хотите заменить таблицу foo
на foo_new
, вам нужно только загрузить новые данные в foo_new
и запустить сценарий для выполнения переименования. Этот сценарий должен выполняться в отдельной транзакции, поэтому, если что-то с переименованием пойдет не так, как foo
, так и foo_new
останутся нетронутыми при откате.
Основная проблема с этим подходом состоит в том, что обработка внешних ключей из других таблиц, имеющих ключ на foo
, может стать немного запутанной. Но, по крайней мере, вам гарантировано, что ваши данные останутся согласованными.
Я думаю, что в долгосрочной перспективе лучший подход - это просто выполнять обновления данных напрямую (ваш первый вариант). Еще раз, вы можете поместить все обновления в одну транзакцию, так что вам будет гарантирована семантика «все или ничего». Еще лучше было бы онлайн-обновления, просто обновляя данные напрямую по мере появления новой информации. Возможно, это не вариант для вас, если вам нужны результаты чьего-либо пакетного задания, но если вы можете это сделать, это лучший вариант.
Я думаю, что в долгосрочной перспективе лучший подход - это просто выполнять обновления данных напрямую (ваш первый вариант). Опять же, вы можете поместить все обновления в одну транзакцию, так что вам будет гарантирована семантика «все или ничего». Еще лучше было бы онлайн-обновления, просто обновляя данные напрямую по мере появления новой информации. Возможно, это не вариант для вас, если вам нужны результаты чьего-либо пакетного задания, но если вы можете это сделать, это лучший вариант.
Я думаю, что в долгосрочной перспективе лучший подход - это просто выполнять обновления данных напрямую (ваш первый вариант). Опять же, вы можете поместить все обновления в одну транзакцию, так что вам будет гарантирована семантика «все или ничего». Еще лучше было бы онлайн-обновления, просто обновляя данные напрямую по мере появления новой информации. Возможно, это не вариант для вас, если вам нужны результаты чьего-либо пакетного задания, но если вы можете это сделать, это лучший вариант.
BEGIN;
DELETE FROM TABLE;
INSERT INTO TABLE;
COMMIT;
Пользователи сразу же увидят переключение, когда вы нажмете фиксацию. Любые запросы, запущенные до фиксации, будут выполняться для старых данных, все последующие запросы будут выполняться для новых данных. База данных фактически очистит старую таблицу после того, как последний пользователь закончит с ней работу. Поскольку все "статично" (вы единственный, кто когда-либо меняет это, и только раз в неделю), вам не нужно беспокоиться о проблемах с блокировкой или тайм-аутах. Для MySQL это зависит от InnoDB. PostgreSQL делает это, а SQL Server называет это «моментальным снимком», и я не могу вспомнить подробности, потому что я редко использую эту вещь.
Если вы погуглите «изоляция транзакции» + имя любой базы данных вы найдете соответствующую информацию.
Мы решили эту проблему, используя механизм наследования / ограничений таблиц PostgreSQL. Вы создаете триггер, который автоматически создает подтаблицы, разделенные на разделы на основе поля даты.
Эта статья была источником, который я использовал.
Какой сервер базы данных вы используете? SQL 2005 и более поздние версии предоставляют метод блокировки под названием «Снимок». Это позволяет вам открыть транзакцию, выполнить все ваши обновления, а затем зафиксировать, пока пользователи базы данных продолжают просматривать данные до транзакции. Обычно ваша транзакция блокирует ваши таблицы и их запросы, но в вашем случае идеально подойдет блокировка моментальных снимков.
Подробнее здесь: http://blogs.msdn.com/craigfr/archive/2007/05 /16/serializable-vs-snapshot-isolation-level.aspx
Но для этого требуется SQL Server, поэтому, если вы используете что-то еще ....
Некоторые системы баз данных (так как вы не указали свою, я оставлю это общее) предлагают стандартный оператор SQL: 2003 под названием MERGE
, который в основном позволит вам чтобы
SQL Server 2008 - первое предложение Microsoft, в котором есть этот оператор - подробнее см. здесь , здесь или здесь .
Другая система баз данных, вероятно, будет иметь аналогичные реализации - в конце концов, это стандартная инструкция SQL: 2003.
Marc
Используйте разные имена таблиц (mytable_ [yyyy] _ [wk]) и представление для предоставления вам постоянного имени (mytable). После того, как новая таблица будет полностью импортирована, обновите ваше представление, чтобы оно использовало эту таблицу.