Как установить внешний ключ для упорядоченного идентификатора

#postgresql #foreign-keys #sequence

#postgresql #внешние ключи #последовательность

Вопрос:

У меня есть следующее определение таблицы для journal

 CREATE TABLE "public"."journal" (
"id" "public"."inc_journal" NOT NULL,
"short_desc" varchar(20),
"description" varchar(1000),
"default_gl_account_id" int8,
"company_id" int2,
"creator_user_id" int4,
"created_date" timestamp(6),
"type" "public"."journal_type",
CONSTRAINT "journal_pkey" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;
 

Def для inc_journal — это последовательность, подобная so:

 CREATE SEQUENCE "public"."inc_journal"
 INCREMENT 1
 MINVALUE 1
 MAXVALUE 4294967295
 START 1
 CACHE 1;
 

И я хочу установить для него внешний ключ следующим образом:

 ALTER TABLE "public"."entry"
ADD FOREIGN KEY ("journal_id") REFERENCES "public"."journal" ("id");
 

Однако, когда я делаю это, я получаю сообщение об ошибке:

[Ошибка] ОШИБКА: ограничение внешнего ключа «entry_journal_id_fkey» не может быть реализовано
ПОДРОБНО: ключевые столбцы «journal_id» и «id» имеют несовместимые типы: integer и inc_journal.

Как мне избавиться от этой ошибки?
Нужно ли мне устанавливать journal_id значение type inc_journal ? Я бы все равно хотел вставить null в поле, так что это не кажется правильным вариантом.

Ответ №1:

Попробуйте использовать тип поля serial для вашего PKey или

 id integer NOT NULL DEFAULT nextval('inc_journal')
 

Это создаст / использует последовательность для вашего PKey. Затем вы можете ввести любые целочисленные поля, которые вы хотите. Смотрите также http://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL .

Комментарии:

1. 1 Это имеет большой смысл, исходя из MySQL, поэтому я столкнулся с некоторой кривой обучения.

Ответ №2:

Если вы используете Sequerize ORM и получаете ошибку, попробуйте выполнить следующее.

Я допустил ошибку, когда Foreign key field у product таблицы был другой тип, чем Primary key field у user таблицы. Когда я подбираю тип, он работает!

Пример

 // user 
    id: {
      type: Sequelize.UUID,     // Foreign key type should match with PK
      allowNull: false,
      primaryKey: true,
      defaultValue: Sequelize.UUIDV4,
   }

// product
    userId: {
      type: Sequelize.UUID,  // FK type should be the same as PK type
      allowNull: false,
      references: {
      model: 'Users',
      key: 'id',
    },