mysql and pgsql

Тема в разделе "Базы данных", создана пользователем afonya09, 6 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    В мускул можно так
    INSERT INTO табл (id, name, region) VALUES ($ad, '$n', '$c')
    ON DUPLICATE KEY UPDATE name = $n, region = '$c'
    на id, name, region стоит ключ.
    если пытается втавить запись которая уже есть он не вставит а обновит ее.
    Есть что-то подобное на пгскул одним запросом???:thenks:
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Чем
    Код:
    REPLACE INTO табл (id, name, region) VALUES ($ad, '$n', '$c')
    не угодил?

    http://www.pointwriter.com/blog/index.php?/archives/6-REPLACE-in-PostgreSQL.html
     
  3. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    ERROR: syntax error at or near "REPLACE"
    LINE 1: REPLACE INTO weather_country (id, iso2, iso3, name) VALUES (...
    ^

    ********** Ошибка **********

    ERROR: syntax error at or near "REPLACE"
    SQL state: 42601
    Характеристика:1

    он не знает REPLACE
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Я имел ввиду мускул - код
    Код:
    INSERT INTO табл (id, name, region) VALUES ($ad, '$n', '$c')
    ON DUPLICATE KEY UPDATE name = $n, region = '$c'
    и
    Код:
    REPLACE INTO табл (id, name, region) VALUES ($ad, '$n', '$c')
    делает одно и тоже.

    А как сделать тоже самое в постгресе, читать по линку, который я дал во 2-ом посте.
     
  5. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Там с подзапросом только.
    Хотелось бы аналог мускул.
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Мне тоже много чего бы хотелось, только имеем мы то, что имеем.

    1. mysql тоже делает подзапрос, только он неявный.
    2. если удастся найти решение без использования правил/тригеров/хранимок - поделитесь, очень интересно.
     
  7. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7
    как вариант можно воспользоваться триггером для таблицы. Думаю не сложно будет переписать под себя из этого примера:

    Код:
    CREATE OR REPLACE FUNCTION MY_INSERT_UPDATE() RETURNS trigger AS $$
    BEGIN
      if exists( select 1 from 1c_transaction where id = NEW.id ) then
        update 1c_transaction set date_start = now() where id = NEW.id;
        RETURN NULL;
      else
         NEW.date_start = now();
         RETURN NEW;
      end if;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER MY_INSERT_UPDATE BEFORE INSERT ON 1c_transaction FOR EACH ROW EXECUTE PROCEDURE MY_INSERT_UPDATE();
    
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Всё проще
    Код:
    CREATE RULE "replace_mytable" AS
        ON INSERT TO "mytable"
        WHERE
          EXISTS(SELECT 1 FROM mytable WHERE id=NEW.id)
        DO INSTEAD
           (UPDATE mytable SET name=NEW.name, region=NEW.region WHERE id=NEW.id)
    и всех делов.
     
    tmcdos, afonya09 и midw0rk нравится это.
  9. afonya09

    afonya09

    Регистр.:
    31 янв 2009
    Сообщения:
    260
    Симпатии:
    18
    Триггеры блокируют записи что не есть хорощо!!!
    От мастера мне понравилось!!!!
     
Статус темы:
Закрыта.