Как проверить выполнение инструкции UPDATE в PostgreSQL? - PullRequest
40 голосов
/ 09 февраля 2012

Как я могу проверить оператор UPDATE, например, чтобы увидеть, будет ли он работать, например, действительно ли он обновит строки и т. Д.?

Есть ли способ легко смоделировать его?

Ответы [ 7 ]

65 голосов
/ 09 февраля 2012

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

Пример:

BEGIN;

UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';

SELECT accounts WHERE name = 'Alice';

ROLLBACK; -- << Important! Un-does your UPDATE statement above!

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

36 голосов
/ 09 февраля 2012

Оберните его в транзакцию , проверьте результаты с помощью SELECT и отката в конце.

BEGIN;

UPDATE ...;

SELECT ...;

ROLLBACK;
3 голосов
/ 09 февраля 2012

Вы всегда можете создать пример базы данных на SQL Fiddle и попробовать там свои инструкции по обновлению.

Полное раскрытие: я автор sqlfiddle.com

1 голос
/ 10 февраля 2012

Вы можете использовать инструмент, который позволяет вам сделать снимок БД и легко выполнить откат к нему. Я рекомендую OffScale - это в основном git для баз данных.

0 голосов
/ 13 февраля 2019

В Postgres вы можете использовать предложение UPDATE RETURNING , чтобы показать, какие строки были модифицированы.

-- example data
CREATE TABLE data(id int, text text);
INSERT INTO DATA VALUES(1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd');

-- original data
SELECT * from data;

-- dry-run update
BEGIN;

UPDATE
  data
SET
  text = 'modified'
WHERE
  id > 2
RETURNING
  id, text;

ROLLBACK;

-- data after dry-run update
SELECT * from data;
0 голосов
/ 09 февраля 2012

Учитывая это простое обновление:

UPDATE Products
   SET price_including_vat = price * 1.05
 WHERE product_type = 'Food';

Я бы проверил его, используя что-то вроде этого:

 SELECT price_including_vat AS price_including_vat__before, 
        price * 1.05 AS price_including_vat__after, 
        *
   FROM Products
 WHERE product_type = 'Food';

На самом деле, я бы, вероятно, включил мозг и сделал бы анализ, как этот:

WITH updated AS 
   (
    SELECT price_including_vat AS price_including_vat__before, 
           price * 1.05 AS price_including_vat__after, 
           *
      FROM Products
    WHERE product_type = 'Food'
   )
SELECT * 
  FROM updated
 WHERE price_including_vat__before = price_including_vat__after;
0 голосов
/ 09 февраля 2012

Сначала выполните ту же проверку с оператором SELECT: строки, возвращаемые SELECT, будут строками, измененными UPDATE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...