我有一张表:
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不要验证插入的行,因为我在触发器中处理了它。
答案 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
中的值(在同一事务中)。