#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',
},