Предположим, у вас есть таблица test
:
DROP TABLE IF EXISTS test;
CREATE TABLE test (foo text, bar int);
INSERT INTO test (foo, bar) VALUES ('A', 1), ('B', 2);
Вы можете добавить к нему столбец id
:
ALTER TABLE test ADD COLUMN id text;
и прикрепите триггер:
DROP TRIGGER IF EXISTS unique_short_id_on_test ON test;
CREATE TRIGGER unique_short_id_on_test
BEFORE INSERT ON test
FOR EACH ROW EXECUTE PROCEDURE unique_short_id();
Теперь создайте временную таблицу, temp
, с такой же структурой, как у теста (но без данных):
DROP TABLE IF EXISTS temp;
CREATE TABLE temp (LIKE test INCLUDING ALL);
CREATE TRIGGER unique_short_id_on_temp
BEFORE INSERT ON temp
FOR EACH ROW EXECUTE PROCEDURE unique_short_id();
Заливка test
в temp
:
INSERT INTO temp (foo, bar)
SELECT foo, bar
FROM test
RETURNING *
дает что-то вроде:
| foo | bar | id |
|------------+-----+----------|
| A | 1 | 9yt9XQwm |
| B | 2 | LCeiA-P8 |
Если в других таблицах есть ссылки на внешний ключ в таблице test
или если test
должен оставаться в сети,
может быть невозможно сбросить test
и переименовать temp
в test
.
Вместо этого безопаснее обновить test
с id
s из temp
.
Предположим, test
имеет первичный ключ (для конкретности, назовем его testid
), затем
Вы можете обновить test
с помощью id
s из temp
, используя:
UPDATE test
SET id = temp.id
FROM temp
WHERE test.testid = temp.testid;
Тогда вы можете сбросить таблицу temp
:
DROP TABLE temp;