2014-01-20 3 views
0

Может ли кто-нибудь объяснить команду if exist, которая используется в SQL?Upsert in node.js - что такое `IF EXIST`?

, например:

if exist(select * from waiter){ 
    update waiter set (...) where waiter_id='somevalue' 
} else{ 
    insert into waiter values (values) 
} 

Не могли бы вы объяснить, как один будет проверить, если обновление/вставка была завершена, не вдаваясь в базу данных?

+1

Какая СУБД вы используете? Postgres? Oracle? –

+0

@a_horse_with_no_name postgres – user3192435

+1

[* Подзапрос оценивается для определения того, возвращает ли он любые строки. Если он возвращает хотя бы одну строку, результатом EXISTS является «true»; если подзапрос не возвращает строк, результат EXISTS является «ложным». *] (http://www.postgresql.org/docs/current/static/functions-subquery.html) –

ответ

2

Я не знаю, если это помогает, но код, вероятно, следует прочитать:

if exist(select * from waiter where waiter_id='somevalue') { 
    update waiter set (...) where waiter_id='somevalue' 
} else{ 
    insert into waiter values (values) 
} 

if exists . . . часть в этом случае говорят «если запись существует в таблице». В целом, в заявлении говорится: «Если в значении есть запись 'somevalue', тогда обновите запись, иначе вставьте новую запись».

+0

Хорошая находка отсутствующее предложение WHERE. –

+1

@MichaelPerrenoud. , , «Если таблицы не пусты, сделайте обновление в записи, которая может быть или не существовать, иначе вставить запись« не похоже на разумную или безопасную вещь. ;) –

+0

@ Gordon Linoff теперь, о чем я мог бы узнать, произошло ли это? Как я узнаю? например, как я узнаю, произошло ли обновление или вставка без поиска в базе данных? – user3192435

0

exists заявление сделать частичное сканирование по SQL, чтобы знать, если что-то было возвращено ..

Если было проверить преформы о exists если comparated со счетом() .. мы увидели бы действительно быстрее, используя SQL существует, так как count будет проверять каждую строку в базе данных.

Надеюсь, это поможет.

+0

Теперь, какой идентификатор я хочу проверить, завершено ли обновление/вставка без поиска в базе данных? @Hugo S. Mendes – user3192435

+0

, тогда вам нужно поставить «where waiter_id =« somevalue »в существующее, как это: существуют (выберите * из официанта, где waiter_id = 'somevalue') –

0

Подход, который вы принимаете, неверен. Это не будет работать. Стоп.

Go прочитать руководство по upserts:

, а затем использовать один из правильных методов документированных там, либо блокировки таблицы и делать upsert, или делать это в цикле повторов.

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

  • person1: select * from waiter
  • PERSON2: select * from waiter
  • PERSON1: if exist(...) => ложно, Неа, не существует
  • PERSON2: if exist(...) => ложно, Неа, не существует
  • person1: insert...
  • PERSON2: insert...

и стрела, у вас есть две записи.

(Этот подход также ужасно неэффективен - SELECT * FROM WAITER просто ужасно).

Вот почему каждый дает вам ссылки на статьи и документацию, показывающие, как это сделать правильно. Вы пытаетесь решить неправильную проблему.Вы действительно говорите: «Когда я завожу свой автомобиль на перекрестке, не глядя на светофоры, как узнать, есть ли кто-нибудь еще?». Мы говорим: «Э, не делай этого. Посмотри на светофоры».

Только один раз, когда у вас есть фактическое upsert («create if not exists»), правильная работа, , затем беспокоиться о том, как с этим бороться с node.js.

Я бы сказал, что это будет как и любой другой запрос. В любом случае: запустите запрос/команду, получите идентификатор (существующий или вновь созданный) в результате запроса, используйте ID, но вы хотите. Если вам нужна дополнительная помощь с этой частью, попробуйте опубликовать конкретный вопрос node.js только на этой части, без всякого беспорядочного беспорядка с кодом-upsert-кодом, чтобы выбросить всех из-под контроля. Учтите, что многие из тегов много не знают о node.js.