SQL, как увеличиться или уменьшиться один для международного столбца в одной команде

Вы можете использовать метод toJSON (), чтобы получить формат стиля DateTime

var today = new Date().toJSON(); 
// produces something like: 2012-10-29T21:54:07.609Z

Оттуда вы можете очистить его ...

Чтобы получить дату и время:

var today = new Date().toJSON().substring(0,19).replace('T',' ');

Чтобы получить только дату:

var today = new Date().toJSON().substring(0,10).replace('T',' ');

Чтобы получить только время:

var today = new Date().toJSON().substring(10,19).replace('T',' ');

Редактировать: Как уже отмечали другие, это будет только работать на UTC. Посмотрите выше для лучших ответов.

108
задан 5YrsLaterDBA 10 June 2009 в 02:00
поделиться

6 ответов

Чтобы ответить на первый:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

Чтобы ответить на второй:

Есть несколько способов сделать это. Поскольку вы не указали базу данных, я буду использовать MySQL.

  1. INSERT INTO table SET x = 1, y = 2 ON DUPLICATE KEY UPDATE x = x + 1, y = y + 2
  2. REPLACE INTO table SET x = 1, y = 2

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

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

233
ответ дан 24 November 2019 в 03:29
поделиться

Одноэтапный ответ на первый вопрос - использовать что-то вроде:

update TBL set CLM = CLM + 1 where key = 'KEY'

Это очень простой способ сделать это с помощью одной инструкции.

Что касается второго вопроса, то вы не нужно прибегать к специальной SQL-гимнастике СУБД (например, UPSERT ), чтобы получить желаемый результат. Существует стандартный метод обновления или вставки, который не требует конкретной СУБД.

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

То есть сначала вы пытаетесь выполнить создание. Если он уже там, игнорируйте ошибку. В противном случае вы создаете его со значением 0.

Затем выполните обновление, которое будет работать правильно, независимо от того:

  • строка изначально существовала.
  • кто-то обновил ее между вашей вставкой и обновлением.

Это не единственная инструкция, и все же, как ни странно, именно так мы успешно выполняем ее долгое время.

11
ответ дан 24 November 2019 в 03:29
поделиться
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

Насколько мне известно, в SQL нет встроенной поддержки INSERT-OR-UPDATE. Я предлагаю создать хранимую процедуру или использовать условный запрос, чтобы добиться этого. Здесь вы можете найти набор решений для различных баз данных.

3
ответ дан 24 November 2019 в 03:29
поделиться

Если я правильно понимаю, обновления должны быть довольно простыми. Я бы сделал следующее.

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

Вам могут потребоваться дополнительные фильтры, чтобы просто обновить одну строку вместо всех строк.

Для вставок вы можете локально кэшировать некоторый уникальный идентификатор, связанный с вашей записью, и проверять этот кеш и решить, вставлять или нет. Альтернативный подход - всегда вставлять и проверять наличие ошибки нарушения PK и игнорировать, поскольку это избыточная вставка.

3
ответ дан 24 November 2019 в 03:29
поделиться

, чтобы ответить на второй:

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

0
ответ дан 24 November 2019 в 03:29
поделиться

@dotjoe Дешевле обновлять и проверять @@ rowcount, делать вставку постфактум.

Исключения являются дорогостоящими && обновления происходят чаще

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

DAL должны быть CRUD, и не нужно беспокоиться о том, что они не имеют состояния.

Если вы сделаете это без сохранения состояния, с хорошими индексами вы не увидите различий со следующим оператором SQL vs 1. ЕСЛИ (выберите верхний 1 * форма x, где PK = @ ID ) Вставить еще обновление

0
ответ дан 24 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

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