условное выражение на дублирующемся ключевом обновлении

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

Одна вещь, которую можно сделать, состоит в том, чтобы записать сценарий, который испускает корректные команды для tcsh или sh, базирующегося, как это вызывается. Если Вы - сценарий, "setit", затем сделайте:

ln -s setit setit-sh

и

ln -s setit setit-csh

Теперь или непосредственно или в псевдониме, Вы делаете это от sh

eval `setit-sh`

или это от csh

eval `setit-csh`

setit использует 0$ для определения его выходного стиля.

Это является напоминающим о том, как люди используют для получения ТЕРМИНА переменная среды.

Преимущество здесь состоит в том, что setit просто записан в том, какой бы ни окружают Вас как как в:

#!/bin/bash
arg0=$0
arg0=${arg0##*/}
for nv in \
   NAME1=VALUE1 \
   NAME2=VALUE2
do
   if [ x$arg0 = xsetit-sh ]; then
      echo 'export '$nv' ;'
   elif [ x$arg0 = xsetit-csh ]; then
      echo 'setenv '${nv%%=*}' '${nv##*=}' ;'
   fi
done

с символьными ссылками, данными выше, и оценка backquoted выражения, это имеет желаемый результат.

Упростить вызов для csh, tcsh, или подобные оболочки:

alias dosetit 'eval `setit-csh`'

или для sh, удара, и т.п.:

alias dosetit='eval `setit-sh`'

Одна хорошая вещь об этом состоит в том, что только необходимо вести список в одном месте. В теории Вы могли даже прикрепить список в файл и поместить cat nvpairfilename между "в" и "делают".

Это в значительной степени, как раньше делались настройки терминала оболочки входа в систему: сценарий произвел бы statments, который будет выполняться в оболочке входа в систему. Псевдоним обычно использовался бы для создания вызова простым, как в "tset vt100". Как упомянуто в другом ответе, в сервере INN UseNet новостей существует также схожая функциональность.

12
задан javalina 25 June 2009 в 18:58
поделиться

4 ответа

Вы можете использовать обычные конструкции sql в синтаксисе ON DUPLICATE KEY . Таким образом, для выполнения условных обновлений во время вставки вы можете сделать следующее:

INSERT INTO tbl (hat, mittens, name) 
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) 
                                    THEN VALUES(name) ELSE name END;

Это изменит значение на то, что вы указали для оператора вставки, если оно отличается от того, что находится в строке, и установит значение, которое оно уже это если он не изменился и в результате MySQL ничего не сделает со строкой, сохраняя временную метку last_update, как указал Квассной.

Если вы хотите быть на 100% уверены, что вы не полагались на поведение MySQL, где он не обновляет строку, если вы устанавливаете значение для себя, вы можете сделать следующее, чтобы установить временную метку:

17
ответ дан 2 December 2019 в 18:20
поделиться

Вам нужен синтаксис INSERT ... ON DUPLICATE KEY UPDATE .

Ваш запрос будет выглядеть так:

    INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george')
    ON DUPLICATE KEY UPDATE name='george';

Если бы у вас была запись с синим / зеленым / george for hat / mittens / name уже, ОБНОВЛЕНИЕ не будет выполнено, и ваша временная метка не будет обновлена. Если, однако, у вас есть запись с синим / зеленым / бетти, то «бетти» будет заменено на «джордж», и ваша временная метка будет обновлена.

3
ответ дан 2 December 2019 в 18:20
поделиться

Вам не нужно ничего делать, это поведение по умолчанию.

Если ваш запрос выбирает строку для UPDATE , но обновленное значение остается таким же, как в:

UPDATE  table
SET     col = col

], отметка времени также остается прежней.

Эта строка даже не считается затронутой, запрос вернет 0 затронутых строк .

0
ответ дан 2 December 2019 в 18:20
поделиться

Если вы выполняете несколько операций INSERT (либо с помощью SELECT , либо с помощью нескольких строк для VALUES ), вы можете сделать следующее:

INSERT INTO tbl (hat,mittens,name) VALUES
    ('yellow','purple','jimmy'),
    ('blue','green','george'),
    ('blue','green','betty')
ON DUPLICATE KEY UPDATE name = VALUES(name);

Это будет:

  • Вставить строки, которые не дублируются с / соответственно. для УНИКАЛЬНЫХ индексов
  • Обновите столбец имя для остальных (если новое значение отличается)

Предостережение: комментарии в документации к ВКЛ Синтаксис DUPLICATE говорит, что результат mysql_affected_rows () впоследствии ненадежен.

0
ответ дан 2 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

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