Создавать уникальные идентификаторы в неуникальных столбцах - PullRequest
0 голосов
/ 14 июля 2020

Рассмотрим эту таблицу:

ex_table

| gid | val |
| --- | --- |
| 1   | v1  |
| 1   | v2  |
| 2   | v3  |

Обратите внимание, что gid является столбцом, подобным id, а не уникальным. Я хочу иметь возможность вставлять значения в таблицу либо путем создания уникального gid, либо путем указания того, какой из них использовать.

Например:

INSERT INTO ex_table (val)
  SELECT --....

Должен генерироваться уникальный gid, а

INSERT INTO ex_table (gid, val)
  SELECT --....

Следует использовать предоставленный gid.

Каким-либо способом сделать это?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы можете делать все, что хотите, с буквой того, что вы говорите, используя значение overriding system и автоматически сгенерированный столбец. Например:

create table t (
    gid int generated always as identity,
    name varchar(255)
);

Тогда

insert into t (name) values ('abc');
insert into t (gid, name) overriding system value values (1, 'def')

вставит две строки со значением gid 1.

Здесь это пример.

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

0 голосов
/ 14 июля 2020

Вы можете попробовать что-то вроде этого

CREATE SEQUENCE table_name_id_seq;

CREATE TABLE table_name (
    gid integer NOT NULL DEFAULT nextval('table_name_id_seq'),
    name varchar);

ALTER SEQUENCE table_name_id_seq
OWNED BY table_name.id;

ИЛИ ПРОСТО

CREATE TABLE table_name(
    gid SERIAL,
    name varchar);

А ЗАТЕМ ВСТАВИТЬ

INSERT INTO fruits(gid,name) 
VALUES(DEFAULT,'Apple');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...