![]() |
|
Модераторы: LSD |
![]()
|
|
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: нет Всего: 15 |
Позарез нужно сделать такую штучку в Oracle 9, но не знаю как(((
В таблицах есть поле ID. Как сделать, чтобы при вставке строк в таблицу или изменении существующих, значение поля ID вставлялось автоматом, причем, чтобы это было значение, которого нет в таблице. Например, 1 строка - ID 1, 2 строка - ID 2, 3 строка - ID 3... Потом вторую строку удалили, вставили новую строку и у нее ID 2... Подскажите, пожалуйста. Желательно, чтоб это можно было сделать в PL/SQL Developer. |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 23 Всего: 44 |
а можно для начала узнать конечную цель. что сподвигло вас на это?
|
|||
|
||||
| Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
Kbl4AH, Вообще то если не учитывать
То это самый стандартный триггер на вставку из последовательности нового значения... Я конечно могу Вам такой триггер написать какой Вы просите со всеми замечаниями ( дело то плевое ) но вот проблема в том что ЭТО либо будет грузить сервер БД( перебор существующих значений ) либо ЭТО будет чревато дополнительной таблицей записей которые были удалены. ИМХО бредятина и то и другое + может привести к неприятным сюрпризам если констрейты "забыть" поднять, короче не советую, да и логика УНИКАЛЬНОСТИ ключевого поля в таком случаи как бы теряется... Это сообщение отредактировал(а) Nuzur - 24.9.2008, 17:14 -------------------- Never again... |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 23 Всего: 44 |
сомниваюсь я что называя данный механизм "плевым" вы задумались о мутации и о том что несколько пользователей одноврименно редактируют таблицу. Nuzur, продемонстрируйте приз, а то мож я от жизни отстал... Это сообщение отредактировал(а) DimW - 24.9.2008, 17:21 |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Издержки на реализацию подобного механизма, в подавляющем (если не сказать в абсолютном) большинстве случаев не оправдывает ценности полученного результата, потому вопрос о целеполагании, заданный DimW, более чем обоснован.
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: нет Всего: 5 |
DimW, Я имел в виду как пример для однопользовательского режима конечно
Если речь идет об отдельной таблицы то SELECT FOR UPDATE никто не отменял... и там после завизировать как использованный. ЗЫ в любом случаи идея граблевая и изменить я это не могу. Zloxa, Спасибо. Но я и сам знаю что вопрос обоснован -------------------- Never again... |
|||
|
||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: нет Всего: 15 |
Я, наверное, неправильно выразился...
Мне нужно, чтобы при вставке новой записи или апдейте существующей (апдейт поля ID), значение присваивалось автоматом. Причем это значение должно удовлетворять требованиям: не должно совпадать с уже существующими ID и должно быть не рамдомным, а следующим по списку и минимальным из возможных (если некоторые ID вследствие удаления строк пропущены)... То есть: 1-е ID - 1, следующее - 2, следующее - 3. Строка с ID 1 - удалена, тогда следующее ID - 1, следующее - 4. Это можно сделать так: создать счетчик (sequence) на +1 (начиная с 1), а потом создать триггер на инсерт/апдейт (причем ID не повторяются). Мне друг показывал как-то давно, но я сейчас не могу вспомнить... Нужно мне это для следующего - в проге используются разные справочники, причем поле ID скрыто от пользователя (оно ему не нужно, он оперирует с содержимым). Есть еще таблицы, которые пользователь инсертит/апдейтит (в таблицах значения некоторых полей - ID из справочников, но видит он не ID, а соответствующее им содержимое). То есть пользователю нужны справочники, но он не оперирует с ID. А при редактировании справочника эти ID должны вставляться автоматом. В Oracle это реализовать легче, чем в Delphi. На словах - использовать в триггере счетчик... Если так - сложно, то нужен хотя бы триггер, который будет автоматом присваивать следующее по порядку значение полю ID (например, вставил строку - ID 1, вставил 2-ю строку - ID 2, вставил 3-ю строку - ID 3; без учета удаленных значенипй ID) |
|||
|
||||
| DimW |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1330 Регистрация: 24.2.2005 Где: Орёл Репутация: 23 Всего: 44 |
да нет же все именно так вас и поняли, поэтому у всех возник один и тот же вопрос, ЗАЧЕМ??? по поводу уникальности поля:
все остальное неимеет смысла даже обсуждать. |
|||
|
||||
| Zloxa |
|
||||||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Это же уже совсем другой кампот:
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
||||||
|
|||||||
| Kbl4AH |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 741 Регистрация: 1.4.2008 Где: Вятка Репутация: нет Всего: 15 |
Спасибо.
|
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 18 Всего: 538 |
Блокировка на таблицу и "пусть весь мир подождет" -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Угу, а мутацию обходить стейтмент триггером + pl/sql table и "пусть все импорты отвалятся" -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Petro123 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
А что разве нельзя id сделать unique или я чего то не догоняю... А что такое мутация? Добавлено через 6 минут и 35 секунд А это наверно типа: - пользователь A хочет добавить - пользователь B уже добавил но свою транзакцию не зафиксировал, - пользователь A не видит добавленное пользователем B |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 37 Всего: 161 |
Trigger Restrictions on Mutating Tables Нет, эта "типа" называется "изоляция тразнакций" Это сообщение отредактировал(а) Zloxa - 25.9.2008, 15:56 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Petro123 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 6.4.2007 Репутация: нет Всего: нет |
Ясно, а можно в двух словах.... |
|||
|
||||
![]()
|
| Правила форума "Oracle" | |
|
|
Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Oracle | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |