2011-09-06 86 views
0

是否可以使用oid数据类型作为主键?使用oid作为主键

CREATE TABLE "Test" 
(
    id oid NOT NULL DEFAULT nextval('"Test_id_seq"'::regclass), 
    "some" text, 
    CONSTRAINT "Test_pkey" PRIMARY KEY (id) 
) 

我想使用unsigned int数据类型。

DrColossos

而且,你不能使用的OID外键约束(至少这是谷歌告诉我)

CREATE TABLE "Test" 
(
    id oid NOT NULL, 
    val text NOT NULL, 
    CONSTRAINT "Test_pkey" PRIMARY KEY (id) 
); 

CREATE TABLE "Test2" 
(
    id integer NOT NULL DEFAULT nextval('"Test2_Id_seq"'::regclass), 
    "TestId" oid NOT NULL, 
    CONSTRAINT "Test2_pkey" PRIMARY KEY (id), 
    CONSTRAINT "Test2_TestId_fkey" FOREIGN KEY ("TestId") 
     REFERENCES "Test" (id) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE RESTRICT 
); 

INSERT INTO "Test"(id, val) VALUES (1, 'one'); 
INSERT INTO "Test"(id, val) VALUES (2, 'two'); 

select * from "Test"; 

insert into "Test2" ("TestId") values (1); 
insert into "Test2" ("TestId") values (2); 
insert into "Test2" ("TestId") values (4); 

ERROR: insert or update on table "Test2" violates foreign key constraint "Test2_TestId_fkey" 
DETAIL: Key (TestId)=(4) is not present in table "Test". 

select * from "Test2"; 
+5

如果转储数据并恢复它,使用OID可能会导致冲突,因为它们是由数据库自动生成的,因此您始终需要使用'-o'转储以确保OID也被导出。此外,你不能在OID上使用外键约束(至少这是谷歌告诉我的)。所以如果你在你的应用程序中使用OID,你应该知道你在做什么。 – DrColossos

+0

也许,我发现的最常见的是不能在引用中使用它的能力。不知道它是如何在索引或类似的。我会建议你不要这样的设计选择。 – DrColossos

+0

谢谢你的评论。我只是在考虑使用oid的可能性 –

回答

1

只是想它会告诉过你是否有可能。答案是肯定的。 (这是不寻常的,但我不明白为什么它会导致问题的原因。)