如何告诉PostgreSQL不要验证数据类型

时间:2012-10-15 07:49:47

标签: postgresql triggers insert foreign-keys postgresql-9.0

我有一张表:

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从公司表中获取id,该值是通过与company_name匹配的字符串。但是当我插入记录PostgreSQL返回错误时,client_name_id是字符串,而int必需,这是真的。

我怎么能告诉PostgreSQL不要验证插入的行,因为我在触发器中处理了它。

1 个答案:

答案 0 :(得分:2)

你要做的事情非常不正统。你确定,这是你想要的吗?当然,您不能将字符串(带有非数字)输入整数列。那不足为奇,对吗?如果您想要输入文本,则必须添加文本列 - 如果要匹配当前布局,请使用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中的值(在同一事务中)。