我对postgres有一个非常非常奇怪的问题。我试图为我的数据库中的业务对象生成GUID,并且我正在为此使用新的模式。我已经用几个业务对象完成了这个工作;我在这里使用的代码已经过测试并在其他场景下工作。Postgres INSERT INTO ...选择违反外键约束
下面是新表的定义:
CREATE TABLE guid.public_obj
(
guid uuid NOT NULL DEFAULT uuid_generate_v4(),
id integer NOT NULL,
CONSTRAINT obj_guid_pkey PRIMARY KEY (guid),
CONSTRAINT obj_id_fkey FOREIGN KEY (id)
REFERENCES obj (obj_id)
ON UPDATE CASCADE ON DELETE CASCADE
)
然而,当我尝试这个使用下面的代码回填,我得到一个SQL状态23503声称我违反了外键约束。
INSERT INTO guid.public_obj (guid, id)
SELECT uuid_generate_v4(), o.obj_id
FROM obj o;
ERROR: insert or update on table "public_obj" violates foreign key constraint "obj_id_fkey"
SQL state: 23503
Detail: Key (id)=(-2) is not present in table "obj".
但是,如果我做一个SELECT源表,价值肯定是存在:
SELECT uuid_generate_v4(), o.obj_id
FROM obj o
WHERE obj_id = -2;
"0f218286-5b55-4836-8d70-54cfb117d836";-2
我感到困惑,为什么Postgres的可能会认为我违反了FKEY约束时我直接从相应的表格中提取值。源表定义中obj_id的唯一约束是它是主键。它被定义为一个序列; select将它作为整数返回。请帮忙!
你是否保持你的模式是直的?我看到你的CREATE TABLE是在'guid'模式中创建的,但'obj'表使用默认模式。 ?? – pbuck
'select relnamespace,relname from pg_class where relname ='obj';' –
我有我的模式直,是的。我使用一个新的模式来保存所有的guid关系,因为需要guid的业务对象并不都在公共模式中。 – Gideon