Добрый день.
У меня есть скрипт на создание таблицы на ms sql и кластерного индекса к ней для оптимизации запросов:
CREATE TABLE [dbo].[SutvValueTable] (
[DayIndex] [smallint] NULL ,
[Seconds] [int] NULL ,
[RegionIndex] [int] NULL ,
[DataIndex] [int] NULL ,
[Value] [float] NULL ,
[Status] [int] NULL
) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [IX_SutvValue_1] ON [dbo].[SutvValueTable]([DayIndex], [Seconds], [RegionIndex], [DataIndex]) ON [PRIMARY]
GO
Я так понимаю этот индекс теперь используется в качестве pk для обеспечения уникальности данных.
Так же у меня есть скрипт для pg:
CREATE TABLE "SutvValueTable"
(
"DayIndex" smallint,
"Seconds" integer,
"RegionIndex" integer,
"DataIndex" integer,
"Value" double precision,
"Status" integer
)
WITHOUT OIDS;
CREATE INDEX "IX_DRDS"
ON "SutvValueTable"
USING btree
("DayIndex", "RegionIndex", "DataIndex", "Seconds");
Я не совсем уверен в правильности данного скрипта, так как нет конкрентого упоминания о том, что индекс будет содержать уникальные данные. Какие средства pg предлагает для того, чтобы сделать этот индекс pk, наподобие как в ms.
PS что значит Using btree, насколько необходима эта опция?
PS кластерные индексы существуют в pg?
см. PRIMARY KEY
Насчет кластерных индексов:
http://postgresql.ru.net/manual/ddl-constraints.html#AEN2275
CREATE TABLE "SutvValueTable"
(
"DayIndex" smallint,
"Seconds" integer,
"RegionIndex" integer,
"DataIndex" integer,
"Value" double precision,
"Status" integer,
PRIMARY KEY ("DayIndex", "RegionIndex", "DataIndex", "Seconds")
)
WITHOUT OIDS;
Результат выполнения запроса:
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "SutvValueTable_pkey" for table "SutvValueTable"
Т.е. автоматически будет создан PRIMARY KEY "SutvValueTable_pkey".
А вот что после этого видим в pgAdminIII:
-- Table: "SutvValueTable"
-- DROP TABLE "SutvValueTable";
CREATE TABLE "SutvValueTable"
(
"DayIndex" smallint NOT NULL,
"Seconds" integer NOT NULL,
"RegionIndex" integer NOT NULL,
"DataIndex" integer NOT NULL,
"Value" double precision,
"Status" integer,
CONSTRAINT "SutvValueTable_pkey" PRIMARY KEY ("DayIndex", "RegionIndex", "DataIndex", "Seconds")
)
WITH (OIDS=FALSE);
Тут и индекс, и уникальность - всё как положено. Чего не скажешь про FOREIGN KEY (ни того, ни другого - тоже как положено), хотя синтаксис тот же.