Как сообщить PostgreSQL не проверять тип данных

У меня есть таблица типа:

CREATE TABLE test(
id integer not null default nextval('test_id_seq'::regclass),
client_name_id integer not null
);

Ограничения внешнего ключа:

"test_client_name_id_fkey" FOREIGN KEY (client_name_id) REFERENCES company(id) DEFERRABLE INITIALLY DEFERRED

и таблица компании:

CREATE TABLE company(
id integer not null default nextval('company_id_seq'::regclass),
company_name character varying(64) not null
)

Теперь у меня есть триггер в тестовой таблице, который извлекает идентификатор из таблицы компаний, используя предоставленное значение client_name_id, которое является строкой, сопоставляя его с company_name. но когда я вставляю запись, PostgreSQL возвращает ошибку, что client_name_id является строкой и требуется int, что верно.

Как я могу сказать PostgreSQL не проверять вставленную строку, поскольку я позаботился об этом в своих триггерах.


person sharafjaffri    schedule 15.10.2012    source источник


Ответы (1)


То, что вы пытаетесь сделать, очень неортодоксально. Вы уверены, что это то, что вы хотите? Конечно, вы не можете ввести строку (без цифр) в целочисленный столбец. Ничего удивительного, верно? Если вы хотите вместо этого ввести текст, вам придется вместо этого добавить текстовый столбец - с ограничением fk на company(company_name), если вы хотите, чтобы он соответствовал вашему текущему макету.

ALTER TABLE test ALTER DROP COLUMN client_name_id; -- drops fk constraint, too
ALTER TABLE test ADD COLUMN client_name REFERENCES company(company_name);

Для этого вам понадобится ограничение UNIQUE на company.company_name.

Однако я бы посоветовал пересмотреть свой подход. Ваша компоновка таблицы кажется правильной. Спусковой крючок является нетрадиционным элементом. Обычно вы бы ссылались на первичный ключ, как сейчас. Не нужен триггер. Чтобы получить название компании, вы должны присоединиться к таблице в SELECT:

SELECT *
FROM   test t
JOIN   company c ON t.client_name_id = c.id;

Кроме того, эти нестандартные модификаторы должны быть только в том случае, если они вам нужны: DEFERRABLE INITIALLY DEFERRED. Например, когда вам нужно ввести значения в таблицу test до того, как вы введете ссылочные значения в таблицу company (в той же транзакции).

person Erwin Brandstetter    schedule 22.10.2012
comment
Я решил эту проблему, реализовав логику FK в запросах, а не в триггере вставки. - person sharafjaffri; 22.10.2012