Создать, если запись не существует, в противном случае обновить?

  1. BeanFactory использует ленивый подход к инициализации, тогда как ApplicationContext использует надежный подход к инициализации. т.е. BeanFactory создает одноэлементный компонент только тогда, когда он запрашивается у него, но ApplicationContext создает все одноэлементные компоненты во время его собственной инициализации.
  2. ApplicationContext создает и управляет объектами ресурсов сам по себе, тогда как BeanFactory был явно предоставлен объект ресурса с использованием синтаксиса:
    ClassPathResource resource = new ClassPathResource("beans.xml");
    
    XmlBeanFactory factory = new XmlBeanFactory(resource); // Here resource object is provided explicitly
    
  3. ApplicationContext поддерживает интернационализацию, но BeanFactory этого не делает.
  4. зависимость от зависимостей Injection не поддерживается BeanFactory, тогда как ApplicationContext поддерживает использование аннотации @PreDestroy, @ Autowired.
29
задан unrelativity 4 August 2011 в 07:21
поделиться

4 ответа

Используйте «REPLACE INTO»:

 REPLACE INTO table SET id = 42, foo = 'bar';

См. Больше в документации MySQL

.
23
ответ дан carl 4 August 2011 в 07:21
поделиться

Многие разработчики все еще выполняют запрос, чтобы проверить, присутствует ли поле в таблице, а затем выполняют запрос вставки или обновления в соответствии с результатом первого запроса. Попробуйте использовать синтаксис ON DUPLICATE KEY, это намного быстрее и лучше, чем выполнение 2 запросов. Более подробную информацию можно найти здесь

ВСТАВИТЬ В таблицу (a, b, c) ЗНАЧЕНИЯ (4,5,6) ON DUPLICATE KEY UPDATE c = 9;

Если вы хотите сохранить то же значение для c, вы можете выполнить обновление с тем же значением

INSERT INTO table (a, b, c) VALUES (4,5, 6) ON DUPLICATE KEY UPDATE c = 6;

разница между «replace» и «on duplicate key»:

replace: вставляет или удаляет и вставляет

для дублирующего ключа: вставляет или обновляет

, если в вашей таблице нет первичного или уникального ключа, замена не имеет никакого смысла.

Вы также можете использовать функцию VALUES, чтобы избежать необходимости указывать фактические значения дважды. Например. вместо

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

вы можете использовать

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

, где VALUES(c) будет оцениваться до значения, указанного предварительно (6).

67
ответ дан Fluffy 4 August 2011 в 07:21
поделиться

Посмотрите ЗАМЕНА в руководстве по MySQL.

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индекса, старая строка удаляется перед вставкой новой строки. См. Раздел 12.2.5, «Синтаксис INSERT».

REPLACE - это расширение MySQL к стандарту SQL. Он либо вставляет, либо удаляет и вставляет. Для другого расширения MySQL к стандартному SQL - который либо вставляет, либо обновляет - см. Раздел 12.2.5.3 , «INSERT ... ON DUPLICATE KEY UPDATE Syntax».

Если у вас есть следующий запрос INSERT:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24)

Это запрос REPLACE, который вы должны выполнить:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24)
2
ответ дан Vegard Larsen 4 August 2011 в 07:21
поделиться

Как уже говорили другие, REPLACE это путь. Просто будьте осторожны, используя его, так как он на самом деле делает DELETE и INSERT на столе. Это нормально в большинстве случаев, но если у вас есть внешние ключи с ограничениями, такими как ON DELETE CASCADE, это может вызвать некоторые большие проблемы.

8
ответ дан nickf 4 August 2011 в 07:21
поделиться
Другие вопросы по тегам:

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