Как я ОБНОВЛЯЮ строку в таблице или ВСТАВЛЯЮ ее, если она не существует?

Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку.

Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле for, она должна быть определена в этом цикле. В этом духе вы должны удалить

my $i;
my $j;

в начале вашего кода. Также имейте в виду, что my объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например,

else {
    my $X_branch=$X2;
    my $Y_branch=$Y2;
    my $Z_branch=$Z2;
}

объявляет 3 переменные, которые не существуют после блока else.

Во-вторых, my объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите

my $x = 5;
return my $x;

В первой строке будет объявлена ​​переменная $x и задано значение 5. Вторая строка объявляет новую переменную $x (таким образом, затеняя старую) со значением undef и возвращает ее. Вместо этого вы хотите написать:

my $x = 5;
return $x;

Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений:

  • [1114 ] должно быть $X_list[$j] (согласно началу этого ответа).

  • Еще в find_branch у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде:

    my ($X_branch, $Y_branch, $Z_branch);
    if (abs($Z1-$Z2) < $rXY) {
        $Z_branch=($Z1+$Z2-$rXY)/2;
        my $a=($Z1-$Z_branch)/$rXY;
        $X_branch=(1-$a)*$X1+$a*$X2;
        $Y_branch=(1-$a)*$Y1+$a*$Y2;
    }
    elsif ($Z1 < $Z2) {
        $X_branch=$X1;
        $Y_branch=$Y1;
        $Z_branch=$Z1;
    }
    else {
        $X_branch=$X2;
        $Y_branch=$Y2;
        $Z_branch=$Z2;
    }
    return ($X_branch,$Y_branch,$Z_branch);
    

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

  • В find_min_dist вы должны писать не my $I = $i и my $J = $j, а, скорее, $I = $i и $J = $j (все еще та же проблема с областями видимости).

  • Ваш подчиненный branch ничего не делает: вы вычисляете некоторые $rho, $theta и $phi, но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169]

  • В generate_pillars_shape, @X_values, @Y_values, @X, @Y все они должны быть локально объявлены с my. Кроме того, вы можете инициализировать @X_values с помощью @X_values = grep {

    Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку.

    Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить

    [110]

    в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например,

    [111]

    объявляет 3 переменные, которые не существуют после блока [118].

    Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите

    [112]

    В первой строке будет объявлена ​​переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать:

    [113]

    Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений:

    • [1114 ] должно быть [1115] (согласно началу этого ответа).

    • Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде:

      [114]

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

    • В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости).

    • Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169]

    • В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для @Y_values), что я считаю более читабельным, чем то, что вы написали.

    • Вы должны поместить свой код в функции или блоки кода ({ ... }), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X, $max_X, $min_Y, $max_Y и $distance как глобальные переменные, вы определенно не хотите, чтобы $min_radian или $b определялись везде в вашем файле.

    • Не используйте $a или $b (это специальные переменные, используемые sort; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172]

    • Кроме того, просто для ясности, в вашем подпункте find_branch вы можете быть немного более компактными, чтобы получить аргументы:

        my ($X1, $Y1, $Z1, $X2, $Y2, $Z2) = @_;
      

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

    % $d == 0 }

    Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку.

    Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить

    [110]

    в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например,

    [111]

    объявляет 3 переменные, которые не существуют после блока [118].

    Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите

    [112]

    В первой строке будет объявлена ​​переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать:

    [113]

    Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений:

    • [1114 ] должно быть [1115] (согласно началу этого ответа).

    • Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде:

      [114]

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

    • В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости).

    • Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169]

    • В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для @Y_values), что я считаю более читабельным, чем то, что вы написали.

    • Вы должны поместить свой код в функции или блоки кода ({ ... }), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X, $max_X, $min_Y, $max_Y и $distance как глобальные переменные, вы определенно не хотите, чтобы $min_radian или $b определялись везде в вашем файле.

    • Не используйте $a или $b (это специальные переменные, используемые sort; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172]

    • Кроме того, просто для ясности, в вашем подпункте find_branch вы можете быть немного более компактными, чтобы получить аргументы:

      [115]

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

    [0] ..

    Я не могу воспроизвести вашу ошибку. Однако в вашем коде много ошибок, поэтому позвольте мне их просмотреть, и, надеюсь, это поможет вам найти вашу реальную ошибку.

    Во-первых, переменные должны быть определены в наименьшей возможной области видимости: если переменная используется только внутри функции, она должна быть определена внутри этой функции. Если переменная используется только в цикле [116], она должна быть определена в этом цикле. В этом духе вы должны удалить

    [110]

    в начале вашего кода. Также имейте в виду, что [117] объявляет лексическую переменную, видимую только в текущей области (то есть , т.е. вы можете использовать ее только в текущем блоке). Например,

    [111]

    объявляет 3 переменные, которые не существуют после блока [118].

    Во-вторых, [119] объявляет новую переменную и поэтому должна использоваться только один раз для каждой переменной. Если вы напишите

    [112]

    В первой строке будет объявлена ​​переменная [1110] и задано значение [1111]. Вторая строка объявляет новую переменную [1112] (таким образом, затеняя старую) со значением [1113] и возвращает ее. Вместо этого вы хотите написать:

    [113]

    Теперь позвольте мне пройтись по вашему коду, чтобы указать на несколько ошибок / улучшений:

    • [1114 ] должно быть [1115] (согласно началу этого ответа).

    • Еще в [1116] у вас есть проблема с областью действия определенных вами переменных (см. Начало моего ответа). У вас должно быть что-то вроде:

      [114]

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

    • В [1117] вы должны писать не [1118] и [1119], а, скорее, [1120] и [1121] (все еще та же проблема с областями видимости).

    • Ваш подчиненный [1122] ничего не делает: вы вычисляете некоторые [1123], [1124] и [1125], но вы не возвращаете их (и вы также не изменяете аргументы) . [+1169]

    • В [1126], [1127], [1128], [1129], [1130] все они должны быть локально объявлены с [1131]. Кроме того, вы можете инициализировать [1132] с помощью [1133] (то же самое для @Y_values), что я считаю более читабельным, чем то, что вы написали.

    • Вы должны поместить свой код в функции или блоки кода ({ ... }), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X, $max_X, $min_Y, $max_Y и $distance как глобальные переменные, вы определенно не хотите, чтобы $min_radian или $b определялись везде в вашем файле.

    • Не используйте $a или $b (это специальные переменные, используемые sort; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172]

    • Кроме того, просто для ясности, в вашем подпункте find_branch вы можете быть немного более компактными, чтобы получить аргументы:

      [115]

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

    [1]
    (то же самое для @Y_values), что я считаю более читабельным, чем то, что вы написали.

  • Вы должны поместить свой код в функции или блоки кода ({ ... }), чтобы использовать правильную область видимости: хотя может иметь смысл иметь $min_X, $max_X, $min_Y, $max_Y и $distance как глобальные переменные, вы определенно не хотите, чтобы $min_radian или $b определялись везде в вашем файле.

  • Не используйте $a или $b (это специальные переменные, используемые sort; вы не хотите связываться с ними (см., Например, этот вопрос ) )). [1 172]

  • Кроме того, просто для ясности, в вашем подпункте find_branch вы можете быть немного более компактными, чтобы получить аргументы:

    [115]

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

80
задан mu is too short 23 July 2013 в 19:41
поделиться

9 ответов

MySQL (и впоследствии SQLite) также поддерживает ЗАМЕНУ В синтаксис:

REPLACE INTO my_table (pk_id, col1) VALUES (5, '123');

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

133
ответ дан andygeers 24 November 2019 в 09:49
поделиться

Поддержки SQLite, заменяющие строку, если это уже существует:

INSERT OR REPLACE INTO [...blah...]

Можно сократить это к

REPLACE INTO [...blah...]

Этот ярлык был добавлен, чтобы быть совместимым с MySQL REPLACE INTO выражение.

31
ответ дан Kyle Cronin 24 November 2019 в 09:49
поделиться

Я сделал бы что-то как следующее:

INSERT INTO cache VALUES (key, generation)
ON DUPLICATE KEY UPDATE (key = key, generation = generation + 1);

Устанавливание значения поколения к 0 в коде или в sql, но использовании НА DUP... для постепенного увеличения значения. Я думаю, что это - синтаксис так или иначе.

21
ответ дан jmoz 24 November 2019 в 09:49
поделиться

Я не знаю, что Вы собираетесь найти независимое от платформы решение.

Это обычно называют "UPSERT".

Посмотрите некоторые связанные обсуждения:

8
ответ дан Community 24 November 2019 в 09:49
поделиться

НА ДУБЛИРУЮЩЕМСЯ пункте ОБНОВЛЕНИЯ КЛЮЧА лучшее решение потому что: ЗАМЕНА делает УДАЛЕНИЕ, сопровождаемое ВСТАВКОЙ так в течение очень небольшого периода, запись удалена, создав очень небольшую возможность, что запрос мог возвратиться пропускавший это, если бы страница была просмотрена во время запроса ЗАМЕНЫ.

Я предпочитаю, ВСТАВЛЯЮТ... НА ДУБЛИРУЮЩЕМСЯ ОБНОВЛЕНИИ... по этой причине.

решение jmoz является лучшим: хотя я предпочитаю синтаксис НАБОРА круглым скобкам

INSERT INTO cache 
SET key = 'key', generation = 'generation'
ON DUPLICATE KEY 
UPDATE key = 'key', generation = (generation + 1)
;
9
ответ дан Fire Crow 24 November 2019 в 09:49
поделиться

В PostgreSQL нет никакой команды слияния и на самом деле записи, что это не тривиально - существуют на самом деле странные пограничные случаи, которые делают задачу "интересной".

Лучшее (как в: работа в самых возможных условиях) подход, должен использовать функцию - такой как один показанный в руководстве (merge_db).

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

updated = db.execute(UPDATE ... RETURNING 1)
if (!updated)
  db.execute(INSERT...)

Просто помните, что это не доказательство отказа, и это перестанет работать в конечном счете.

5
ответ дан 24 November 2019 в 09:49
поделиться

Стандартный SQL обеспечивает оператор MERGE для этой задачи. Не вся поддержка DBMS оператор MERGE.

4
ответ дан Jonathan Leffler 24 November 2019 в 09:49
поделиться

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

0
ответ дан Arnshea 24 November 2019 в 09:49
поделиться

Вы могли использовать триггер вставки? Если это перестало работать, сделайте обновление.

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

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