Помощь по Oracle

Lord Maverik
На сайте с 15.04.2003
Offline
471
677

Задача. Есть только удаленное подключение к БД, к определенным таблицам.

Есть таблица АAA.

Записать в нее данные, с уникальным полем ID.

Как я делаю сейчас:

'SELECT * FROM (SELECT ID FROM AAA ORDER BY ID DESC) WHERE ROWNUM <= 1';

Получив ID, увеличиваю его на 1.

$id++;

Далее вставляю запись.

'INSERT INTO AAA (ID,DATA) VALUES ($id,$data)';

По коду конечно отличается немного, суть такая, упростил для понимания.

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

Как избежать этого?

Я с Ораклом глубоко на "вы", работаю с mysql.

Думаю может надо так:

1. определяю, заблокирована таблица или нет. если да, то выходим.

2. ставим блокировку таблицы.

3. определяю новое ID

4. вставляю запись

5. Снимаю блокировку.

Но как это реализовать и правильно ли так не пойму. Требуется помощь :)

Таблица ААА уже существует, с ней уже работаем, в ней уже есть какие-то записи.

Нужно чтобы начиная с ней работать с любого момента, ID правильно прописывалось.

Имеется только удаленный доступ к одной таблице и все. Я не могу зайти на сервер и что-то там создать.

Известный вариант реализации автоинкремента - создать счетчик. В итоге так и сделаем. Напишу админа сервера, где оракл стоит. Т.е. они создадут счетчик, чтобы было автоинкрементное поле.

Но мне нужно решить также вопрос, исходя из ситуации, что такой счетчик создать невозможно.

---------- Добавлено 03.06.2016 в 08:48 ----------

На форуме sql.ru посоветовали:

1. Брать lock table in exclusuve mode перед вставкой. И пусть весь мир подождет.
2. Если вставкой не занимается "третья сила" (т.е. Вы - единственный писатель, весь код, вставляющий данные в таблицу, Вам подконтролен) - то можно использовать dbms_lock, это даст возможность не препятствовать всяким update.
3. Повесить primary|unique key. Обрабатывать exception dup_val_on_index - зациклить вычисление id и вставку до успеха.

Но как это в SQL командах записать? :(

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
Mik Foxi
На сайте с 02.03.2011
Offline
1215
#1
Получив ID, увеличиваю его на 1.

а что-нибудь типа id INTEGER PRIMARY KEY AUTOINCREMENT в оракле нету, чтоб само id +1 вставляло?

Антибот, антиспам, веб фаервол, защита от накрутки поведенческих: https://antibot.cloud/ (Зеркало: https://антибот.рф/ ) Форум на замену серчу: https://foxi.biz/
ДП
На сайте с 23.11.2009
Offline
203
#2

Я не спец по БД ораклу, но в базе, в которой сейчас работаю сделано на триггере и sequence:

TRIGGER WRKBNCH.MODEL_DETAILS_MODEL_SK_TRG BEFORE

INSERT ON WRKBNCH.MODEL_DETAILS FOR EACH ROW WHEN (NEW.MODEL_SK IS NULL) BEGIN :NEW.MODEL_SK := WRKBNCH.MODEL_DETAILS_MODEL_SK_SEQ.NEXTVAL;
END;

CREATE SEQUENCE "WRKBNCH"."MODEL_DETAILS_MODEL_SK_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 116 NOCACHE ORDER NOCYCLE ;

Lord Maverik
На сайте с 15.04.2003
Offline
471
#3
foxi:
а что-нибудь типа id INTEGER PRIMARY KEY AUTOINCREMENT в оракле нету, чтоб само id +1 вставляло?

нету

Дикий пионер:
Я не спец по БД ораклу, но в базе, в которой сейчас работаю сделано на триггере и sequence:

ну вот я же пишу, что так и будет в итоге, но нужно еще одно решение, без счетчика.

N
На сайте с 06.05.2007
Offline
419
#4

Lord Maverik, в оракле это называется sequence. А чтобы он волшебным образом работал так же как mysql нужно сделать trigger, который получает значение из sequence из записывает в поле.

Короче, повеселитесь на славу с этим ораклом. Может бросите?

---------- Добавлено 03.06.2016 в 16:48 ----------

Lord Maverik:
ну вот я же пишу, что так и будет в итоге, но нужно еще одно решение, без счетчика.

Почитал я sql.ru.

Там тоже все считают это бессмысленными телодвижениями, а варианты предложили просто потому что могут, а не потому что следует это делать.

Кнопка вызова админа ()
[Удален]
#5

Насколько понимаю, тут надо смотреть в сторону SELECT FOR UPDATE

---------- Добавлено 03.06.2016 в 19:34 ----------

Вот похожее: http://www.sql.ru/forum/1004745/blokirovka-na-chtenie-tablicy

остановились на Dbms_lock, http://my-oracle.it-blogs.com.ua/post-42.aspx

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий