如何告诉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
)

现在我在测试表上触发了触发器,它使用提供的值从公司表中获取 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 中输入引用的值(在同一事务中)。

相关内容

  • 没有找到相关文章

最新更新