powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беззнаковое число в PostgreSQL
25 сообщений из 25, страница 1 из 1
Беззнаковое число в PostgreSQL
    #32984809
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли использовать беззнаковые числа в PostgreSQL? Аналог unsigned int в MySQL.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32984847
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно , см. доках CREATE TABLE
CHECK (my_field>=0)

если ты хочешь преаращать signged в unsigned при insert'ах то скорее всего придется юзать тригера
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32984868
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не. Не так.
Задача простая:
Создаём таблицу, где первое поле ключевое и счётчик.
Если счётчик тип int , то имеем 2 147 483 647 возможных значений счётчика.
А если unsigned int , то в два раза больше.
Другими словами, 4 байта можно использовать более эффективно.
В MySQL есть операнд UNSIGNED, а в PostgreSQL как?
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32985030
centur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм... а что сериал уже исчерпался ?

с таким подходом что инт лучше - делаем текст поле, на текст триггер, который и поле увеличивает и кучу всего проверяет, если надо, тады и unsigned отдыхает... тут собственно бесконечность у нас в руках.. А еще тут есть уникальность в рамках базы (если не автоинкремент делать, а что похитрей...) =))

А если често не разу еще не видел чтобы сериал за 100 млн перевалил, может конечно мало видел.....
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32985040
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
centurХмм... а что сериал уже исчерпался ?
...
А если често не разу еще не видел чтобы сериал за 100 млн перевалил, может конечно мало видел.....

А мне и не надо, чтобы счётчик доходил до сумасшедших чисел. Как раз наоборот. Если бы был оператор UNSIGNED для любого целочисленного типа, то остальное дело техники. Можно было бы сделать свою последовательность, эффективно используя всё пространство числового значения а не только положительную его часть. Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32985127
DkmS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
А вы что-то сэкономить хотите таким образом? Кроме места на диске, другого и не видно, что тут можео сэкономить. Оцените, во что выльется экономия двух байтов в 10 млн. записей.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32985502
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DkmS Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
А вы что-то сэкономить хотите таким образом? Кроме места на диске, другого и не видно, что тут можео сэкономить. Оцените, во что выльется экономия двух байтов в 10 млн. записей.

Да, это понятно, но желание всё оптимизировать присутствует всегда и не даёт спокойно спать.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32985704
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape Например UNSIGNED SMALLINT дало бы счётчик на 65534 значения. И т.д.
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)

вот и вся ёптимизация
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32986431
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)
вот и вся ёптимизация

Каким образом можно int2 присвоить значение 65534 , если сервер располагает все значения для данного типа в диапазоне от -32768 до +32767 , а беззнаковые величины не декларированы?
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32986652
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape 4321
наверное это дело техники
например:
Код: plaintext
1.
2.
CREATE TABLE testsmall
(id int2  DEFAULT  (nextval('testsm_id_seq'::text) %  ( 65534 ) -  6534 / 2   ),
name text)
вот и вся ёптимизация

Каким образом можно int2 присвоить значение 65534 , если сервер располагает все значения для данного типа в диапазоне от -32768 до +32767 , а беззнаковые величины не декларированы?
вопрос неверный.
правильный вопрос (имеющий отношение к оптимизации)
можно ли засунуть в инт2 65534 значений счетчика. Ответ - можно. Как - показано выше. Если вам счетчики нужны не в какчестве ссылочных полей (для связей), а как нечто значимое (т.е. оптимизация у вас левым боком) - ничто не мешеате Вам интерпретировать id как id + 6534/2 на клиенте .

И не пытайтесь иметь людям мозги.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32986654
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шиза...

ну вычитай из своего unsigned int 2 147 483 647 и получиш свой сигнед инт.. воткнеш его спокойно в базу и сиди радуйся оптимизации :))
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987026
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвопрос неверный.
правильный вопрос (имеющий отношение к оптимизации)
можно ли засунуть в инт2 65534 значений счетчика. Ответ - можно. Как - показано выше. Если вам счетчики нужны не в какчестве ссылочных полей (для связей), а как нечто значимое (т.е. оптимизация у вас левым боком) - ничто не мешеате Вам интерпретировать id как id + 6534/2 на клиенте.

Нет, вопрос-то как раз верный. Несколькими постами выше я и ставил условие задачи, что счётчик является ключевым полем и естественно служит для связи. Оптимизировать-то мне нужно хранение данных на сервере, а не работу клиента с числовыми данными. Согласитесь, если есть возможность не хранить лишние байты в базе, то их не надо хранить. От этого и скорость выше и база меньше.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987416
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape
Несколькими постами выше я и ставил условие задачи, что счётчик является ключевым полем и естественно служит для связи.

Что мешает отрицательному числу быть ключевым полем и служить для связи?
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987474
DkmS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad SpiritЧто мешает отрицательному числу быть ключевым полем и служить для связи?
Привычка, скорее всего.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987833
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad Spirit
Что мешает отрицательному числу быть ключевым полем и служить для связи?

DkmS
Привычка, скорее всего.

Привычка здесь не причём. Виной всему всё та же оптимизация и совмещение функций. Мешает этому то, что кроме того, это ключевое поле по совместительству является номером документа или клиента. Согласитесь, странный номер клиента -147 524 . Применять какой либо изврат на стороне клиента, типа подстановки дополнительных буковок в зависимости от знака, есть нарушение бизнес-логики. Для нумерации документов это вообще не подходит ни каким боком. Если создавать отдельное поле для номера, то какая это нахрен оптимизация?!
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987879
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой тип называется oid он 4х байтный беззнаковый.. если совесть позволит испоьзуй. :)
если нет

CREATE TYPE uint4
(INPUT=oidin, OUTPUT=oidout, DEFAULT='',
INTERNALLENGTH=4, ALIGNMENT=int4, STORAGE=PLAIN);

CREATE CAST (int4 AS uint4)
WITHOUT FUNCTION
AS IMPLICIT;

CREATE CAST (uint4 as int4)
WITHOUT FUNCTION
AS IMPLICIT;

и т.д...
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987913
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape
Применять какой либо изврат на стороне клиента, типа подстановки дополнительных буковок в зависимости от знака, есть нарушение бизнес-логики.

мдя. ("А почему, собственно" у Вас нарушается логика? Не сезонное ли это?)


Никто не утверждает, что наличие беззнаковых типов не упростило бы жизнь в таких вот "крайних случаях" (хм). Просто сказано, что отоптимизировать "в этом смысле" - дело техники. И вернуть вместо -1318 целое число (сдвигом, а совсем таки не "в зависимости от знака") - тоже дело техники. Причем не сложной. Нежелание этим заниматься - ваша проблема. Т.к. это Вам было необходимо что-то там оптимизировать. А совсем не мне.

"А ты азартен, Парамоша"
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987927
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ape
Привычка здесь не причём. Виной всему всё та же оптимизация и совмещение функций. Мешает этому то, что кроме того, это ключевое поле по совместительству является номером документа или клиента. Согласитесь, странный номер клиента -147 524 .
Использовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.

Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32987961
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad SpiritИспользовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.
Согласен. Как правило, такое разделение "значащих полей" полей и суррогатных ключей избавляет хтоя бы от необходимости каскадов (что очень далеко от "оптимальности") при "удалении пропусков" (и прочих изменениях "значения"

Sad Spirit
Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.
Не, ну wbear показал, как можно создавать свои типы. Это полезно. И снимает вопрос.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #32988625
Ape
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad Spirit
Использовать значение ключевого поля в кач-ве номера на клиенте --- неправильное решение, следующим вопросом очевидно будет "как избавиться от пропусков в нумерации". Единственная задача "суррогатного" первичного ключа --- идентифицировать запись, его значение никого особо интересовать не должно.

Вообще, вся тема напоминает настойчивый поиск более-менее искуственного недостатка с целью к нему прикопаться.


Ну, зачем же так резко. Я спросил, Вы ответили. Не нравится вопрос, не отвечайте.

4321
мдя. ("А почему, собственно" у Вас нарушается логика? Не сезонное ли это?)


Спасибо за личностное определение... и за помощь в разборе вопроса.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Беззнаковое число в PostgreSQL
    #34515822
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я согласен с автором топика. Мне тоже выёживаться с отрицательными идентификаторами влом.
Не понятно вообще почему отсутствует фундаментальный, с математической точки зрения, тип "положительное целое число" и введен как стандарт производный от него тип(понятие) "отрицательное целое число". Вот разработчики MySQL взяли на себя смелость не согласиться с этой очевидной глупостью и добавили беззнаковые типы, в отличие от разработчиков PostgreSQL,Interbase и Oracle.

Также совершенно непонятно отсутсвие int1 в этих трех уважаемых СУБД. Между тем этот тип нужен позарез. У меня в базе множество справочников с диапазоном 0..255 и множество таблиц которые на эти стравочники ссылаются. Я много раз спрашивал как реализовать то, как реализовать это и не получал вразумительного ответа ни разу. Вместо этого получал "умные советы" применять типы ,большей размерности, что чревато увеличением размера индекса в памяти и на диске и удвоением размера базы данных.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #34515890
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того автоинкремент(SERIAL) int2,int4,int8 никак не позволит использовать отрицательный диапазон(выдаст ошибку), поэтому не понятно как создать ключевое поле с полным диапазоном значений.

Кроме того даже если это удасться, то выборка с сортировкой по первичному ключу(который предполагает возрастание значений во времени) даст неправильный порядок записей. Для правильной сортировки придется вводить дополнительные поля.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #34515975
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySQLCraftКроме того автоинкремент(SERIAL) int2,int4,int8 никак не позволит использовать отрицательный диапазон(выдаст ошибку), поэтому не понятно как создать ключевое поле с полным диапазоном значений.

Кроме того даже если это удасться, то выборка с сортировкой по первичному ключу(который предполагает возрастание значений во времени) даст неправильный порядок записей. Для правильной сортировки придется вводить дополнительные поля.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
postgres=# create sequence my_seq start - 20000  minvalue - 20000 ;
CREATE SEQUENCE
postgres=# select nextval('my_seq');
 nextval
---------
  - 20000 
( 1  запись)

postgres=# select nextval('my_seq');
 nextval
---------
  - 19999 
( 1  запись)
....
postgres=# insert into t1 values ( nextval('my_seq'), '1');
INSERT  0   1 
postgres=# insert into t1 values ( nextval('my_seq'), '2');
INSERT  0   1 
...
postgres=# alter sequence my_seq restart with  0 ;
ALTER SEQUENCE
postgres=# insert into t1 values ( nextval('my_seq'), '7');
INSERT  0   1 
postgres=# insert into t1 values ( nextval('my_seq'), '8');
INSERT  0   1 
...
postgres=# select * from t1 order by id;
   id   | val
--------+--------
 - 19970  |  1 
 - 19969  |  2 
 - 19968  |  3 
 - 19967  |  4 
 - 19966  |  5 
 - 19965  |  6 
       0  |  7 
       1  |  8 
       2  |  9 
       3  |  10 
( 10  rows)

postgres=# select * from t1 order by id desc;
   id   | val
--------+--------
       3  |  10 
       2  |  9 
       1  |  8 
       0  |  7 
 - 19965  |  6 
 - 19966  |  5 
 - 19967  |  4 
 - 19968  |  3 
 - 19969  |  2 
 - 19970  |  1 
( 10  rows)
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #34517198
MySQLCraft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. был жестоко обманут менеджером pgAdmin3, который не позволял устанавливать отрицательных начальных значений, а при попытке в инсерте переполнить int и уйти в отрицательный диапазон я получал ошибку...

Был неправ. Значит всё ОК! Просто нужно всё делать ручками.
Я возрадовался со всеми уважаемыми читателями.
...
Рейтинг: 0 / 0
Беззнаковое число в PostgreSQL
    #34518006
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с топикстартером, unsigned поля были бы очень кстати. А к изобретателем велосипеда которые ездит задом вперед - у вас во многих таблицах сериальные ключи имеют отрицательные значения?

А нахерачить по десять строк то для обхода того-сего, эт конечно можно. Но, имхо, не нужно.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Беззнаковое число в PostgreSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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