Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2012, 17:10   #11
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Это в практике прямой шаг к сложнейшим глюкам в виде повреждения целостности данных (Вы же не апдейтите те поля, которые ссылаются на данное ключевое поле), более того, это в данном случае ВООБЩЕ НЕ НУЖНО ДЕЛАТЬ!
Я же сказал ниже, что для форейн кеев нужно указывать каскадный апдейт. Вы вообще читаете что я пишу до конца или выхватываете кусками?
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Ибо проблема у TC мнимая!
Это не проблема. Это задача, которая ему интересна. И он спрашивает как её решить. Он не называет это проблемой. Учится человек, узнаёт новое.
Цитата:
Сообщение от =master= Посмотреть сообщение
А номер по порядку зависит от многих условий, вставте в выборку order by (к примеру), и ваши номера полетят к чертовой матери, а следовательно их смысловая нагрузка стремительно приближается к полному нулю.
Разговор тут вообще не об этом. Не в смысловой нагрузке. А в "закрывании" дырок.
Цитата:
Сообщение от =master= Посмотреть сообщение
Если так уж надо некий номер по порядку, то делают так как Serge_Bliznykov в #5 указал.
Перечитал несколько раз. Он предлагает в этом посте - не заниматься этим вопросом и цитирует "поправляя" меня. Что он тут делает? Что я проглядел?
Вообще меня завели этим спором я и сделал триггер рабочий и только что проверил:
Код:
CREATE
TRIGGER `test`.`mytrigins`
BEFORE INSERT ON `test`.`myt`
FOR EACH ROW
BEGIN
declare n int;
declare m int default 0;
select max(n1) from myt into m;
if m is null then
  set new.n1=1;
else
  select distinct n1+1 from myt a where NOT EXISTS(select n1 from myt b where b.n1 = a.n1 + 1) and a.n1<m limit 1 into n;
  if n is null then
    set new.n1=m+1;
  else
    set new.n1=n;
  end if;
end if;
END$$
Даже на after delete ничего вешать не надо.
Опять же писал сходу, возможно можно что-то более оптимально, но этого я уже точно не буду.
ЗЫ
Чтобы не было вопросов: форейн кеи на каскадные апдейты, а у таблицы поле-ключ n1 int default 0 второе поле текстовое. Для теста заполнять только текстовые поля номера будут проставляться сами.

Последний раз редактировалось temaps; 02.05.2012 в 17:17.
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 17:12   #12
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
А в "закрывании" дырок.
Для чего? "абы было"?
=master= вне форума Ответить с цитированием
Старый 02.05.2012, 17:27   #13
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от =master= Посмотреть сообщение
Для чего? "абы было"?
Вам знаком термин "самообразование"?
Цитата:
Сообщение от patch Посмотреть сообщение
... но чисто для себя ....
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 17:49   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в "закрывании" дырок.
Такие дыры закрываются вычисляемыми полями, а не триггерами или генераторами, или последовательностями или еще черти знает чем. И не в базе а на экране клиента. Че тут спорить?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.05.2012, 18:01   #15
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Цитата:
Вам знаком термин "самообразование"?
Так и в чем проблема, автору и объяснили что это не надо, а вот вы ему сомнительный код, если не сказать больше, который его так самообразует. что мало не покажется.
Так кто из нас "медвежью услугу" оказывает?
=master= вне форума Ответить с цитированием
Старый 02.05.2012, 22:05   #16
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Я не претендую на крутость кода. Но почему вы без всяких объяснений и примеров начинаете кидаться "сомнительный", "мина замедленного действия", "лучше не надо".
Про "лучше не надо" вроде выяснили. Если проект сложный/серьёзный с большой нагрузкой на базу и т.п. это использовать врядли будут. Но сделать это в небольшой программе просто чтобы сделать-потренироваться лично я считаю идеей замечательной. И доставляет внутреннее наслаждение тот факт, что номера не простаивают и нет лишнего приращения, когда можно вставить на освободившееся место запись.
А про "сомнительность" и пр. никто не привёл не то что лучшего, а вообще никакого другого решения. "Не надо" и всё тут. Код работает - я специально написал, что проверил. В чём его сомнительность? В том, что вы не можете понять что я написал? Или сил не хватает признать неправоту?
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 22:11   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

temaps, загоните в таблицу три-четыре тысячи записей, сделайте несколько сотен дырок и пусть десяток пользователей одновременно добавляют записи в эту таблицу используя ваш механизм заполнения дырок. Уверены на 100%, что накладок не будет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.05.2012, 22:15   #18
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Я просто в шоке. Я между прочим трачу время, чтобы читать посты внимательно, т.к. уважаю собеседников вне зависимости от того, что мнения могут расходится. Вы читали вообще мой пост сразу перед Вашим?
temaps вне форума Ответить с цитированием
Старый 02.05.2012, 22:58   #19
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

temaps Это вы понять не можете, что то что ненадо - делать ненадо. Всё просто.
Вы поймите никаких дырок там нет, вы не заполните освободившееся место, так как его нет, да да нет, так устроена работа баз данных, дырок нет - пустот тоже. А то что вы видите это мистика, не обращайте внимания.
И код приводить смысла нет, так как нет предмета для кода.

Возмем например поле с целочисленным типом в 4 байта, такой класический интежер. Предположем что в таблицу каждый день без выходных и праздников будет добавлятся 100000 новых записей (а это очень много, нереально много), Дырки заполнять не будем, а теперь посчитайте когда вы дойдете до предела этого интежера. К тому времени ни вас ни меня ни тем более системы уже и в помине не будет. Люди уже будут летать к краю вселенной, на поясе болтаются бластеры, и идут межгалактические сражения. Во накатал...
Ну как, про мнительность теперь стало яснее?
=master= вне форума Ответить с цитированием
Старый 02.05.2012, 23:03   #20
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

Вы тоже не читали мой пост #16?
Я разве спорил с тем, что номеров хватит?
temaps вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37