Рассмотрим следующее определение таблицы:
CREATE TABLE containers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id SERIAL REFERENCES containers(id)
);
Когда я INSERT INTO containers(name) VALUES('test_name')
, я получаю следующее:
SELECT * FROM containers;
id | name | parent_id
----+-----------+-----------
1 | test_name | 1
(1 row)
Похоже, что значения по умолчанию для parent_id
— это значение id
той же строки. В идеале это было бы NULL
. Я пытался добиться этого с помощью следующего:
CREATE TABLE containers (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id SERIAL REFERENCES containers(id) DEFAULT NULL
);
Но получил следующую ошибку:
ОШИБКА: для столбца «parent_id» таблицы «контейнеры» указано несколько значений по умолчанию.
Могу ли я что-нибудь сделать, чтобы добиться того, чего хочу?
Прочтите Сериал и станет понятно в чем проблема.
Типичным вариантом использования здесь будет вставка новой дочерней записи с априорным знанием того, что является родителем дочернего элемента. Итак, предполагая, что ваша первоначальная запись уже была вставлена, мы можем ожидать, что вставка будет выглядеть следующим образом:
INSERT INTO containers (name, parent_id) VALUES('sweet child of parent', 1);
В вашем случае, если намерение состоит в том, чтобы вставить корневой родительский элемент (определяемый как одна запись, не имеющая родительского элемента), вам следует явно указать NULL в качестве parent_id
:
INSERT INTO containers (name, parent_id) VALUES('root', NULL);
Я понимаю, просто значение по умолчанию не имеет смысла. По крайней мере, можно ли явно потребовать значение для parent_id
(удалить значение по умолчанию)?
... наоборот, это имеет смысл, поскольку автоматически сгенерированное значение id
равно 1, и вы не переопределили какое-то другое явное значение parent_id
.
Это не решает реальную проблему с типом данных. serial
здесь неправильный тип данных, вам нужно целое число.
Чтобы гарантировать, что столбец parent_id
по умолчанию имеет значение NULL вместо значения идентификатора той же строки, вам необходимо настроить определение таблицы.
Проблема возникает потому, что тип SERIAL автоматически создает последовательность и устанавливает значение по умолчанию, которое противоречит указанию DEFAULT NULL.
Это правильный ответ. Не используйте serial
здесь.
Используйте INT в качестве типа данных для родительского_ид, а не серийного номера.