>我有一个表格,如下所示:
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
)
现在我在测试表上触发了触发器,它使用提供的值从公司表中获取 id client_name_id该值通过将其与 company_name 匹配来作为字符串,但是当我插入记录 PostgreSQL 返回错误时,client_name_id是字符串和 int 必需的,这是真的。
我怎么能告诉 PostgreSQL 不要验证插入的行,因为我已经在触发器中处理了它。
你想做的事情是非常非正统的。你确定,这就是你想要的吗?当然,您不能在整数列中输入字符串(带有非数字)。这并不奇怪,对吧?如果要改为输入文本,则必须添加文本列 - 如果要匹配当前布局,则company(company_name)
使用fk约束。
ALTER TABLE test ALTER DROP COLUMN client_name_id; -- drops fk constraint, too
ALTER TABLE test ADD COLUMN client_name REFERENCES company(company_name);
您需要对company.company_name
进行UNIQUE
约束才能允许此操作。
但是,我建议重新考虑您的方法。您的表格布局看起来很正确。触发器是非常规元素。通常,您会引用主键,就像现在一样。无需触发器。要获取公司名称,您需要在SELECT
中加入表:
SELECT *
FROM test t
JOIN company c ON t.client_name_id = c.id;
此外,这些非标准修饰符应该只在您需要时才存在:DEFERRABLE INITIALLY DEFERRED
.例如,当您必须在表 test
中输入值时,然后再在表 company
中输入引用的值(在同一事务中)。