Почему не могу присвоить primary key не id полю?

Есть вот така таблица

CREATE TABLE users
(
    id         serial            not null,
    chat_id    bigint            not null   primary key,
    username   varchar(255),
    full_name  varchar(255)

);

Я хочу присвоить полю chat_id prymary key, но когда запускаю питон скрипт по созданию бд, получаю вот такую ошибку

asyncpg.exceptions. InvalidForeignKeyError: there is no unique constraint matching given keys for referenced table "users"

Могу ли я присвоить prymary key не id полю?


Ответы (1 шт):

Автор решения: Мелкий
melkij=> CREATE TABLE users
(
    id         serial            not null,
    chat_id    bigint            not null   primary key,
    username   varchar(255),
    full_name  varchar(255)
);
CREATE TABLE
melkij=> \d users
                                             Таблица "public.users"
  Столбец  |          Тип           | Правило сортировки | Допустимость NULL |           По умолчанию            
-----------+------------------------+--------------------+-------------------+-----------------------------------
 id        | integer                |                    | not null          | nextval('users_id_seq'::regclass)
 chat_id   | bigint                 |                    | not null          | 
 username  | character varying(255) |                    |                   | 
 full_name | character varying(255) |                    |                   | 
Индексы:
    "users_pkey" PRIMARY KEY, btree (chat_id)

Никаких проблем.

InvalidForeignKeyError: there is no unique constraint matching given keys for referenced table "users"

Если всё-таки прочитать сообщение об ошибке - то будет видно что она относится к механизму foreign keys. Где-то в местах, не имеющих отношения к этому create table, вы пытаетесь создать внешний ключ. Внешний ключ обязан ссылаться на поля, являющиеся уникальными в таблице, для чего требуется существование первичного или уникального ключа по этой комбинации полей. Или по одному полю в простом и наиболее распространённом случае.

Точный текст запроса, приводящий к ошибке, вы можете достать из лога СУБД.

→ Ссылка