#mysql #sql #database #postgresql #hibernate
#mysql #sql #База данных #postgresql #переход в спящий режим
Вопрос:
Я не могу вставить запись в базу данных POSTGRES, я хочу, чтобы внешний ключ был нулевым.
Моя таблица:
CREATE TABLE sad_avaliado (
id BIGSERIAL NOT NULL,
tenant_id INT8 NOT NULL,
funcionario_id BIGSERIAL NOT NULL,
epoca_id BIGSERIAL NOT NULL,
cca_id BIGSERIAL,
avaliador_id BIGSERIAL NOT NULL,
apagado boolean NOT NULL,
PRIMARY KEY (id)
);
alter table sad_avaliado add constraint sad_funcionario_fkey foreign key (funcionario_id) references sad_funcionario;
alter table sad_avaliado add constraint sad_epoca_fkey foreign key (epoca_id) references sad_epoca;
alter table sad_avaliado add constraint sad_cca_fkey foreign key (cca_id) references sad_cca;
alter table sad_avaliado add constraint sad_avaliador_fkey foreign key (avaliador_id) references sad_avaliador;
Моя вставка SQL:
INSERT INTO public.sad_avaliado(
id, tenant_id, funcionario_id, epoca_id, cca_id, avaliador_id, apagado)
VALUES (1, 1, 1, 1, null, 1, false);
Моя ошибка:
ERROR: null value in column "cca_id" violates not-null constraint
Комментарии:
1. Вы должны использовать только один [большой] серийный номер для каждой таблицы. Сделайте поля int8, удалите значения по умолчанию, удалите последовательности. Также столбец может иметь
not null
значение по умолчанию, потому что это bigserial. Проверьте сd sad_avaliado
Ответ №1:
Ссылки на внешний ключ для BIGSERIAL
должны использовать BIGINT
:
CREATE TABLE sad_avaliado (
id BIGSERIAL NOT NULL,
tenant_id INT8 NOT NULL,
funcionario_id BIGINT NOT NULL,
epoca_id BIGINT NOT NULL,
cca_id BIGINT,
avaliador_id BIGINT NOT NULL,
apagado boolean NOT NULL,
PRIMARY KEY (id)
);
Я думаю, что это единственное исключение из представления о том, что ссылки на внешний ключ должны иметь тот же тип, что и первичный ключ. Я имею в виду, что базовый тип тот же, но BIGSERIAL
используется для указания того, что он автоматически увеличивается (другие базы данных используют отдельное ключевое слово, такое как auto_increment
или identity
).
Комментарии:
1. Это было действительно полезно 🙂 На самом деле я создавал таблицу и задавался вопросом, почему некоторые из моих столбцов автоматически устанавливаются в обязательное значение и имеют последовательность в их определении как «column_default». Я не думал о том, что «bigserial» на самом деле является оболочкой для «bigint», которая увеличивает рекламу; Я думаю, может быть, тот факт, что я в основном использовал базы данных Oracle, отчасти объясняет меня?
Ответ №2:
bigserial предназначен для автоматически добавляемых столбцов идентификаторов и по умолчанию имеет значение «not null» и создает одну последовательность.
И вы не должны указывать свой идентификатор в операторах insert, поскольку он вставляется по умолчанию с помощью nextval()
смотрите этот пример
test=# create table test01 ( id bigserial );
CREATE TABLE
test=# d test01*
Table "public.test01"
Column | Type | Collation | Nullable | Default
-------- -------- ----------- ---------- ------------------------------------
id | bigint | | not null | nextval('test01_id_seq'::regclass)
Sequence "public.test01_id_seq"
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
-------- ------- --------- --------------------- ----------- --------- -------
bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
Owned by: public.test01.id
Ответ №3:
Используйте bigint
вместо bigserial
.