Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Автоинкремент своими руками   Найти похожие ветки 

 
Term   (2004-11-18 10:23) [0]

Значит проблема такая нужно автоинкремент заполнять определённым обпразом скажем чтобы генерились значения типа 1.1, 1.2 и т.д. 1. -префикс для всей базы, использую MSSQL2000, есть в данной СУБД генераторы такие или набодобие как в FB. чтобы из них получить уникальное значение а скажем в тригере слепить нужное значение и вставить в поле???


 
Ega23 ©   (2004-11-18 10:27) [1]

Нет. Самому генерить надо. Или в ХП проавила прописать.

З.Ы. А нафига? Сделай ключ первичный как стандартный IDENTITY + добавь ещё одно поле, куда и пиши свои дроби. Я бы так сделал, по крайней мере.


 
Johnmen ©   (2004-11-18 10:27) [2]

автоинкриментное поле + вычисляемое поле
А вообще - всё это от лукавого...


 
ЮЮ ©   (2004-11-18 10:27) [3]

>1. -префикс для всей базы
ну и зачем? эту "1." достаточно рисовать, а не хранить

>значения типа 1.1, 1.2
а какого они будут типа?


 
Nikolay M. ©   (2004-11-18 10:27) [4]

Умножить на 10^х. Что мешает для каждой базы назначить стартовый номер генерации (Identity seed) кратный, скажем, миллиону?


 
Term   (2004-11-18 10:30) [5]


> а какого они будут типа?

естесвенно символы


 
Ega23 ©   (2004-11-18 10:31) [6]

primary key - CHAR????
Фи, как некультурно....


 
ЮЮ ©   (2004-11-18 10:33) [7]

А потом, почему у меня
1.1
1.10
1.2
я хочу
1.1
1.2
1.10
:(


 
Nikolay M. ©   (2004-11-18 10:40) [8]


> Term   (18.11.04 10:30) [5]
> > а какого они будут типа?
> естесвенно символы

Чушь какая... Да еще естественно...
Вот вечно изобретают свои велосипеды.


> ну и зачем? эту "1." достаточно рисовать, а не хранить

Имхо, ему это для репликации (скорее всего опять же самопальной) нужно.


 
Соловьев ©   (2004-11-18 10:43) [9]


> А потом, почему у меня
> 1.1
> 1.10
> 1.2
> я хочу
> 1.1
> 1.2
> 1.10


А так
1.01
1.02
1.10
?


 
Anatoly Podgoretsky ©   (2004-11-18 10:44) [10]

Для репликации надо использовать другие методы, а не городить велосипед с квадратными колесами.


 
Term   (2004-11-18 10:45) [11]


> Имхо, ему это для репликации (скорее всего опять же самопальной)
> нужно.

енто точно просто без самопальной не обойтись


 
Term   (2004-11-18 10:47) [12]


> Для репликации надо использовать другие методы, а не городить
> велосипед с квадратными колесами.

подскажи круглые


 
Term   (2004-11-18 10:49) [13]

просто еще такая фигня иногда значение сгенеренного поля нужно будет поменять


 
Term   (2004-11-18 10:50) [14]


> primary key - CHAR????
> Фи, как некультурно....

я про primary key ничего не говорил вроде


 
Term   (2004-11-18 11:03) [15]

народ так есть способ это делать нормально, без хитростей от лукавого :)


 
Nikolay M. ©   (2004-11-18 11:12) [16]


> Term   (18.11.04 11:03) [15]
> народ так есть способ это делать нормально, без хитростей
> от лукавого :)

Да. Штатными средствами генерации автоинкремента и репликации.


 
Term   (2004-11-18 11:14) [17]


> Да. Штатными средствами генерации автоинкремента и репликации

штатные не годятся, нет постоянного соединения между двумя серверами, а данные перегонять нужно, поэтому изобретаются колёса по возможности более круглые


 
vuk ©   (2004-11-18 11:20) [18]

У нас используется ручная генерация искусственных ключей. Дело в том, что во-первых генерация искусственных ключей может происходить по какому-либо хитрому закону (пример - счетчик * 10 + код_подразделения или еще как-то), а во-вторых в старых версиях MSSQL был баг, когда слетали identity и значения начинали генериться повторно. С тех пор соломку стелим - проблем нет.

С реализацией проблем не вижу. Есть табличка с двумя полями (имя таблицы + счетчик). Перед вставкой записи генерится ID для нужной таблицы и вставляется вместе с остальными данными. Правда есть одна тонкость - у нас вся работа с данными ведется через хранимые процедуры и клиенты не имеют прямого доступа к таблицам. Поэтому все операции с данными находятся под контролем.

to Term   (18.11.04 10:49) [13]:
>просто еще такая фигня иногда значение сгенеренного поля нужно
>будет поменять
А вот это в корне неправильно. Идентификатор, он на то и идентификатор, чтобы быть неизменным.


 
Anatoly Podgoretsky ©   (2004-11-18 11:22) [19]

Репликация не подразумевает постоянное соединение, она даже таким понятием и не фигурирует. А поскольку речь про MSSQL2000 то у нее есть и ключи расчитаные на репликацию.
Рекомендуется внимательно почить BOL как по ключам/типам, так и по репликации.


 
sniknik ©   (2004-11-18 11:26) [20]

именно так как в вопросе
CREATE TABLE Table1 (ID INT IDENTITY(10, 1), FioID AS Cast(Cast(ID AS Money)/10 AS Char(10) ), Name VarChar(100))
FioID - нужное поле


 
Term   (2004-11-18 11:32) [21]


> А вот это в корне неправильно. Идентификатор, он на то и
> идентификатор, чтобы быть неизменным

я знаю просто я не озвучил всей задачи


> MSSQL2000 то у нее есть и ключи расчитаные на репликацию.

значение ключа ИМЕЕТ значение и в другой БД не должно меняться такова задача, поэтому всю кашу и заварил


 
Anatoly Podgoretsky ©   (2004-11-18 11:42) [22]

Term   (18.11.04 11:32) [21]
значение ключа ИМЕЕТ значение и в другой БД не должно меняться такова задача, поэтому всю кашу и заварил

И это GUID, такой тип там есть и он устойчив к репликации и уникальность, название немного другое, проверь по BOL


 
sniknik ©   (2004-11-18 11:45) [23]

> название немного другое ...
uniqueidentifier


 
Nikolay M. ©   (2004-11-18 11:59) [24]


> Term   (18.11.04 11:32) [21]
> > А вот это в корне неправильно. Идентификатор, он на то
> > и идентификатор, чтобы быть неизменным
>
> я знаю просто я не озвучил всей задачи

Тренируешь наши телепатические способности? :)
А озвучить хотя бы в общем задачу? Что за манера, спрашивать А, а получив правильный ответ говорить, что вообще-то имелось ввиду Б?


 
Term   (2004-11-18 12:15) [25]


> И это GUID, такой тип там есть и он устойчив к репликации
> и уникальность, название немного другое, проверь по BOL

я в курсе, не совсем же лентяй .

просто по гуиду нельзя определить с какого сервака эта запись пришла, а это тоже нужно, в общем не с проста я это замыслил, т.е. как я понял из всего выше сказанного вставку надо делать только с помошью хранимых процедур??? и в них получать нужные значения, сделать автоикремент и по его значению получать составное поле. я всё прально понял???


 
Term   (2004-11-18 13:05) [26]

и к тамуже при использовании гуида, вероятность генерения одинаковых идентификаторов, офигенна мала но не нулевая, а это не радует, с учётом того что записей может быть много миллионов вероятность всё же есть... так что даже малая вероятность ошибки


 
Nikolay M. ©   (2004-11-18 13:05) [27]


> просто по гуиду нельзя определить с какого сервака эта запись
> пришла

Это тебе с товарищем нужно объединяться :)
http://delphimaster.net/view/15-1100700493/


> вставку надо делать только с помошью хранимых процедур

Ну вот, теперь еще хранимые процедуры почему-то возникли...

Я не пойму, что мешает разделить все значения int на несколько диапазонов и на каждом сервере генерить автоинкремент только в пределах позволенного ему диапазона?


 
sniknik ©   (2004-11-18 13:38) [28]

> Я не пойму, что мешает разделить все значения int на несколько диапазонов и на каждом сервере генерить автоинкремент только в пределах
> позволенного ему диапазона?
а дополнительное поле с номером подразделения кто мешает завести? это все предлагалось, но вместо принятия логичного/и обсуждения конкретного, вылезли выводы по каким то ХП ([25]), а логичное упорно игнорируется.


 
Term   (2004-11-18 14:01) [29]


> а дополнительное поле с номером подразделения кто мешает
> завести? это все предлагалось, но вместо принятия логичного/и
> обсуждения конкретного, вылезли выводы по каким то ХП ([25]),
> а логичное упорно игнорируется.

ничего не игнорируется,

> Правда есть одна тонкость - у нас вся работа с данными ведется
> через хранимые процедуры и клиенты не имеют прямого доступа
> к таблицам. Поэтому все операции с данными находятся под
> контролем.

отсюда взялись ХП.

а просто смастерить на основе identity не годиться, т.к. идентити нельзя править, а мне нужно чтобы можно было менять


 
Nikolay M. ©   (2004-11-18 14:17) [30]


> на основе identity не годиться, т.к. идентити нельзя править

Это твое очередное "естественно"? Может, БОЛ почитать?


> а дополнительное поле с номером подразделения кто мешает
> завести?

Или так, собственно, не суть важно. Похоже, автор дейстувет по принципу: нам чужие велосипеды не нужны - мы свой придумаем...


 
vuk ©   (2004-11-18 14:46) [31]

to Nikolay M. ©  (18.11.04 13:05) [27]:
>Я не пойму, что мешает разделить все значения int на несколько
>диапазонов и на каждом сервере генерить автоинкремент только в
>пределах позволенного ему диапазона?
Можно, но диапазоны должны быть достаточно широкими, чтобы исключить пересечения. Иной раз это не очень удобно.

to sniknik ©   (18.11.04 13:38) [28]:
>а дополнительное поле с номером подразделения кто мешает
>завести?
А одно другого не исключает. Просто при наличии составного ключа менее удобно делать ссылки при построении FK. То есть наличие естественного ключа не исключает удобства наличия искусственного.


 
Term   (2004-11-18 14:47) [32]


> Это твое очередное "естественно"?

нет это противоестественно :))) но требуется


 
sniknik ©   (2004-11-18 15:26) [33]

"противоестественным" способом можно и автоинкремент изменить, читайте BOL. (в который раз? ;о))


 
Nikolay M. ©   (2004-11-18 15:37) [34]


> vuk ©   (18.11.04 14:46) [31]
> Можно, но диапазоны должны быть достаточно широкими, чтобы
> исключить пересечения. Иной раз это не очень удобно.

Я отнюдь не навязыавл этот способ, просто интересовали причины "против".


> Term   (18.11.04 14:47) [32]
> нет это противоестественно :)))

А изменять твои "1.2" - это более "естественно"?


 
Term   (2004-11-18 15:38) [35]


> противоестественным" способом можно и автоинкремент изменить,
> читайте BOL. (в который раз? ;о))

я это тоже читал там есть свои грабли, как я понял после этого меняется значение которое он выдаст при следующей вставке. Т.Е. если было 1000 я его поменял на 2000 то след будет 2001, я так понял


 
Ega23 ©   (2004-11-18 15:40) [36]

Неправильно ты понял. Читай про SET IDENTITY_INSERT


 
vuk ©   (2004-11-18 15:46) [37]

to Nikolay M. © (18.11.04 15:37) [34]:
>просто интересовали причины "против".
Основная причина против - если идентификаторы используются не только для внутренних связей данных, а например являются артикулами товаров (кодами заказов, продаж и т.п.), то, я думаю, понятно, что короткими идентификаторами оперировать проще, чем длинными. Но если разбивать идентификаторы на диапазоны по подразделениям и пытаться уйти от пересечений диапазонов, то длинных идентификаторов избежать вряд ли удасться.


 
Nikolay M. ©   (2004-11-18 16:08) [38]


> vuk ©   (18.11.04 15:46) [37]

Таких ситуаций я и сам могу придумать с десяток, меня интересовало, что конкретно происходит у автора :)


> Ega23 ©   (18.11.04 15:40) [36]

Ты все-таки не вытерпел :)))


 
vuk ©   (2004-11-18 16:12) [39]

to Nikolay M. ©   (18.11.04 16:08) [38]:
Что интересовало - это я понял. Просто как вариант привел примеры из жизни. Не придумал.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.027 c
6-1097245773
P@$l-l0l-(
2004-10-08 18:29
2004.12.19
Sockets. Ошибка при подключении


3-1100766672
TAN_K
2004-11-18 11:31
2004.12.19
Заполнение данных формы из справочника


11-1084117189
a_legayda@mtu-net.ru
2004-05-09 19:39
2004.12.19
TKOLListBox


14-1101958957
080D:07BBh
2004-12-02 06:42
2004.12.19
Кажется опять студенты пошли со своими лабараторными.


4-1099742073
_Delphin_
2004-11-06 14:54
2004.12.19
Как сделать панель задач?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский