2010-04-21 93 views
1

我与PostgreSQL的努力创造用C编写PostgreSQL的 - CREATE INDEX

例如某些数据类型,我有:

typedef struct Point3D 
{ 
    char id[50]; 
    double x; 
    double y; 
    double z; 
    Point3D; 
} 

的输入和输出功能是否工作正常。

但问题是以下几点: Point3D的每个id必须是唯一的(并且可以是NULL),所以我决定在这个字段id上创建一个唯一索引,但这有可能吗?

我想在这样的事情:

CREATE UNIQUE INDEX test_point3d_idx ON test_point3d ((getID(columname))); 

其中的getID返回columname领域ID。

但我需要实现getID,我真的被阻止。

有什么建议吗?

回答

0

一个独特的列将允许NULL的多个值,因为NULL是一个未知值,因此一个null与另一个相比不能真正被认为是相等的。现在在逻辑上你可能会认为NULL = NULL为真,但唯一的约束不会这样工作。

简单的例子来证明它。

CREATE TABLE test2 
(
    unq_id integer NULL, 
    CONSTRAINT uq_test2 UNIQUE (unq_id) 
); 


INSERT INTO test2 
SElECT NULL; 

INSERT INTO test2 
SElECT NULL; 

INSERT INTO test2 
SElECT NULL; 

SELECT * 
FROM test2; 
+0

这个问题真的更多关于如何获得在postgresqu- – nos 2010-04-21 19:47:59

+0

自定义类型的索引工作首先,谢谢你4你的答复。 其次,@nos是对的,我想让我的索引在我的c数据类型上工作。 我知道null不等于另一个null值,但事实上,这是我想要的行为。 在这种情况下,用户可以提供一个id给一个点,但如果没有,id为null,所以会有很多id字段等于null的点。 迎接所有人,再次感谢。 – mocopera 2010-04-21 20:53:00

1

Postgres的手动节“Interfacing Extensions To Indexes解释说:”用户定义的类型,如您的三维点索引。这需要相当数量的工作。我不知道任何捷径。

与你的问题无关:你确定你需要这个C语言的Point3D数据类型吗?这种数据类型定义中的错误可以是“confuse or even crash the server”。我认为这同样适用于支持它的C语言操作员功能。

您可以创建具有四列的表格,每个Point3D字段一个表格?否则,你可以放弃C支持简单的CREATE TYPE point3d AS (id char(50), x float8, y float8, z float8)吗?也许不是,但值得一试...

+0

感谢您的回复。您提供的链接非常有趣,将来会对我有所帮助。它解释了如何在您的自定义数据类型(Point3D)上创建索引,但是我需要索引处理数据类型的字段(Point3D.id)。 我需要使用c数据类型,因为它需要高性能。 “CREATE TYPE AS与表的行类型基本相同...”,而CREATE TYPE创建一个新的基类型。 无论如何,我只是创建了一个函数getPointID,它只是简单的返回一个Point3D的id,并且正在工作。 :D 感谢您的时间。 – mocopera 2010-04-22 20:06:27

相关问题