powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Два вопроса от "чайника" (primary key, references)
13 сообщений из 13, страница 1 из 1
Два вопроса от "чайника" (primary key, references)
    #34653198
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
create table spr (id serial, name varchar(20));
create table people (id serial references spr(id), name varchar(20));

Так нужно создавать таблицу spr:
create table spr (id serial primary key, name varchar(20)) ?

Без primary key не создается references!
primary key создает лишний индекс!
Нужен ли вообще на практике references?
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653224
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно без первичного ключа не получится ссылки.
Индекс не лишний
Нужен - это поддержка целостности данных. Если вам на целостность наплевать с высокой колокольни, то можете не делать. Но готовьтесь разруливать ситуации, когда в пиплах будет лежать то, чего нет в спр.
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653335
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamirКонечно без первичного ключа не получится ссылки.
Индекс не лишний
Нужен - это поддержка целостности данных. Если вам на целостность наплевать с высокой колокольни, то можете не делать. Но готовьтесь разруливать ситуации, когда в пиплах будет лежать то, чего нет в спр.

Тип serial (integer DEFAULT nextval('tablename_colname_seq') NOT NULL)
создает индекс на поле id.
Primary key создает такой же индекс на id.

Один из индексов явно лишний!
Прочитал в Inet, что в Oracle на таблицы c небольшим кол-вом записей не делают вообще
индексов, а вводят какой-то хитрый тип данных.
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653340
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из документации PostgreSQL 8.1.9:
Note: Prior to PostgreSQL 7.3, serial implied UNIQUE. This is no longer automatic. If you wish a serial column to be in a unique constraint or a primary key, it must now be specified, same as with any other data type.

А если нужно serial и одновременно primary key?
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653427
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinLinПрочитал в Inet, что в Oracle на таблицы c небольшим кол-вом записей не делают вообще
индексов, а вводят какой-то хитрый тип данных.Скорее всего Вы имеете ввиду не хитрый тип данных, а хитрый тип таблиц IOT (индекс-ориентированные таблицы). Но это оракл, и с такими таблицами тоже надо быть осторожным.
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653448
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забудем про Oracle :)
Что с PgSQL делать, когда нужна последовательность и первичный ключ?
Создать последовательность, первичный ключ разными командами
и не использовать serial?
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653455
Фотография pamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinLinТип serial (integer DEFAULT nextval('tablename_colname_seq') NOT NULL)
создает индекс на поле id.
Можно поинтересоваться - как вы это увидели? Сейчас полазил PgAdmin'ом, нашел только констрейнты типа primary key. Никаких лишних индексов не вижу.
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34653727
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamir WinLinТип serial (integer DEFAULT nextval('tablename_colname_seq') NOT NULL)
создает индекс на поле id.
Можно поинтересоваться - как вы это увидели? Сейчас полазил PgAdmin'ом, нашел только констрейнты типа primary key. Никаких лишних индексов не вижу.

Правда Ваша, нет там дополнительных индексов.
Это я напутал, сам создал в программе лишний индекс.
Сейчас из DBF перегоняю в PgSQL.

Еще трудность возникла:
в DBF можно было найти max(date) из индекса и далее считать все оставшиеся поля,
PgSQL не дает считывать дополнительных полей:
Разрешено: select id,max(dt) from people group by id;
Нужно: select id,max(dt), p1, p2, p3 from people group by id;

people(id, p1, p2, p3) и infprog(id, people_id, dt, p1, p2, p3 ...)
infprog.people_id могут повторяться, people.id и infprog.id - уникальные.
Нужно из infprog выбрать по max(dt) значения p1 ... p20 и занести в people,
связав people.id и infprog.people_id.

1) Создал две функции по people_id ищем max(dt), по max(dt) и people_id ищем infprog.id
2) Навернул update с двумя вложенными select
Исполнения update не дождался в обоих случаях. В таблице всего 8000 записей!

3) Cоздал временную таблицу temp(people_id,infprog_id) и потом по ней искал связи,
сделав предварительно индексы people_id и infprog_id.
Время выполнения секунд 10.

Как в таких случаях поступают?
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34654323
ignitor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно так например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select foo.idcontract,
(select date_change from percent where percent.idcontract=foo.idcontract order by date_change desc limit  1 ) as maxdate 
from 
(select percent.idcontract from percent group by percent.idcontract) as foo

explain analyze

"Subquery Scan foo  (cost=714.96..50892.39 rows=5904 width=8) (actual time=31.056..167.508 rows=5904 loops=1)"
"  ->  HashAggregate  (cost=714.96..774.00 rows=5904 width=8) (actual time=30.998..35.390 rows=5904 loops=1)"
"        ->  Seq Scan on percent  (cost=0.00..658.57 rows=22557 width=8) (actual time=0.021..12.576 rows=22557 loops=1)"
"  SubPlan"
"    ->  Limit  (cost=8.48..8.48 rows=1 width=4) (actual time=0.019..0.019 rows=1 loops=5904)"
"          ->  Sort  (cost=8.48..8.49 rows=4 width=4) (actual time=0.016..0.016 rows=1 loops=5904)"
"                Sort Key: date_change"
"                ->  Index Scan using idx_perc1 on percent  (cost=0.00..8.44 rows=4 width=4) (actual time=0.005..0.008 rows=4 loops=5904)"
"                      Index Cond: (idcontract = $0)"
"Total runtime: 170.458 ms"
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34654340
ignitor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а чтовы использовать остальные поля можно выборку предыдущего поста сделать временным видом, и использовать как хотишь
Код: plaintext
1.
2.
3.
4.
5.
6.
create temp view idcontract_maxdate as
select foo.idcontract,
(select date_change from percent where percent.idcontract=foo.idcontract order by date_change desc limit  1 ) as maxdate 
from 
(select percent.idcontract from percent group by percent.idcontract) as foo;
select * from contract join idcontract_maxdate on idcontract_maxdate.idcontract=contract.id
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34654624
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё так можно:
Код: plaintext
1.
2.
3.
select i.* from infprog i
inner join (select people_id, max(dt) as dt from infprog group by people_id) as foo
  on (i.people_id = foo.people_id and i.dt = foo.dt);
ну или сразу так:
Код: plaintext
1.
2.
3.
4.
5.
update people
  set p1 = i.p1, p2 = i.p2, p3 = i.p3 from infprog i
  where i.people_id = people.id and i.dt = (
    select max(dt) from infprog where people_id = people.id
  );
...
Рейтинг: 0 / 0
Два вопроса от "чайника" (primary key, references)
    #34655378
WinLin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёшещё так можно:
Код: plaintext
1.
2.
3.
select i.* from infprog i
inner join (select people_id, max(dt) as dt from infprog group by people_id) as foo
  on (i.people_id = foo.people_id and i.dt = foo.dt);
ну или сразу так:
Код: plaintext
1.
2.
3.
4.
5.
update people
  set p1 = i.p1, p2 = i.p2, p3 = i.p3 from infprog i
  where i.people_id = people.id and i.dt = (
    select max(dt) from infprog where people_id = people.id
  );


Спасибо за помощь, все работает!
Понравилась идея использования "limit=1 order by dt desc".
Проблемой соблюдения стандарта SQL наверно уже не буду озадачиваться,
только PgSQL и ничего более :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Два вопроса от "чайника" (primary key, references)
    #39238615
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamir WinLinТип serial (integer DEFAULT nextval('tablename_colname_seq') NOT NULL)
создает индекс на поле id.
Можно поинтересоваться - как вы это увидели? Сейчас полазил PgAdmin'ом, нашел только констрейнты типа primary key. Никаких лишних индексов не вижу.

PgAdmin-ом автосоздаваемые индексы и не увидите - они их, суки, принципиально прячут!
пруф: http://grokbase.com/t/postgresql/pgadmin-support/041wj72rwh/indexes-generated-for-primary-key-are-not-show-by-pgadminiii

И лишь запрос к словарю
Код: plsql
1.
SELECT * FROM pg_indexes i where i.tablename = '<table name>';

покажет правду (((

(да, знаю что некропост. Но блин сам сегодня нарвался!)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Два вопроса от "чайника" (primary key, references)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]