PostgreSQL - СОЗДАТЬ ИНДЕКС - PullRequest
       6

PostgreSQL - СОЗДАТЬ ИНДЕКС

1 голос
/ 21 апреля 2010

Я работаю с PostgreSQL для создания некоторых типов данных, написанных на C.

Например, у меня есть:

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

Функции ввода и вывода работают правильно.

Но проблема в следующем: Каждый идентификатор Point3D должен быть уникальным (и может иметь значение NULL), поэтому я решил создать уникальный индекс для этого поля id, но возможно ли это?

Я думаю примерно так:

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

где getID возвращает идентификатор поля имени столбца.

Но мне нужно реализовать getID, и я действительно заблокирован.

Любой совет?

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

В разделе руководства Postgres " Взаимодействие расширений с индексами " объясняются индексы для пользовательских типов, таких как Point3D. Это требует изрядного количества работы. Я не знаю никаких ярлыков.

Не имеет отношения к вашему вопросу: действительно ли вам нужен этот тип данных Point3D на языке C? Ошибки в таком определении типа данных могут « привести в замешательство или даже вызвать сбой сервера ». Я предполагаю, что то же самое относится и к поддерживающим его функциям оператора языка Си.

Не могли бы вы создать таблицы с четырьмя столбцами, по одному для каждого поля Point3D? В противном случае, вы могли бы отказаться от C в пользу простого CREATE TYPE point3d AS (id char(50), x float8, y float8, z float8)? Возможно нет, но стоит попробовать ...

0 голосов
/ 21 апреля 2010

Уникальный столбец допускает множественные значения 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...