2010-04-21 74 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

相關問題