|
|
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Hi, All! Маленькая проблемка. Есть табличка, одно из полей (ID) Not NULL, для его заполнения использую генератор и триггер на BI. Нужно обеспечить уникальность всех полей, кроме ID. Создал индекс (UNIQUE) на все поля кроме ID, в принципе работает, запись не вставляет, но генератор всё равно инкрементится :( а этого бы не хотелось. Код триггера на BI: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Предварително искать запись тоже не хочется - долго может получиться... Подскажите плз. может кто уже делал подобное... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 10:50 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Дырки в ID не ндравятся? А чем они мешают? Если уж сильно надо - создай другое поле и нумеруй его посте вставки. ID оставь без изменений как ПК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 11:32 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
CREATE TRIGGER PHONES_ID FOR PHONES ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(PHONES_NEW_ID, 1); end Ты проматываешь генератор когда ID IS NULL !!! А потом задаешь такие вопросы !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 11:52 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
CREATE TRIGGER PHONES_ID FOR PHONES ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.ID IS NULL) THEN попробуй вот это --> NEW.ID = GEN_ID(PHONES_NEW_ID, 1); заменить на это --> NEW.ID = (SELECT MAX ID FROM PHONES) + 1 end мне часто приходилось использовать такой принцип. Просто я пишу на Delphi + Interbase .... и делал это в Delphi. но принцип от этого не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 12:02 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
KeepeRпопробуй вот это --> NEW.ID = GEN_ID(PHONES_NEW_ID, 1); заменить на это --> NEW.ID = (SELECT MAX ID FROM PHONES) + 1 И огребёшь по самый корешЁк в многопользовательском режиме. Фи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 12:09 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
2 KeepeR: нуну... ты сейчас насоветуешь... почитай лучше вот тут, особенно 3 пункт http://www.ibase.ru/devinfo/dontdoit.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 12:12 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
А из триггера на AFTER INSERT к добавленной записи в FireBird 1.5 можно как нибудь добраться? Идея такая: Поле ID объявить как INTEGER DEFAULT 0 и в триггере на AFTER INSERT менять 0 на GEN_ID(PHONES_NEW_ID, 1). Только как это сделать? NEW.ID = GEN_ID(PHONES_NEW_ID, 1) поле не меняет :( на PHONES.ID = GEN_ID(PHONES_NEW_ID, 1) ругается типа нет переменной ID... ...В Оракле вроде можно было, хотя не помню :( давно дело было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 12:46 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
В after insert модификация псевдопеременной " NEW " не оказывает влияния на значения вставленной строки. Если ты таки хочешь поменять только-что вставленные значения, то в триггере after insert нужно выполнить обычный апдейт. Код: plaintext 1. 2. НО! К посталенной задаче это не имеет никакого отношения ;) Без принудительного резервирования таблицы, при многопользовательской работе, дырки будут. И даже при резервировании, они тоже могут возникнуть, если к примеру, возникнет потребность удалить пару записей. Так что, имхо, " овчинка вычинки не сто ит"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 13:22 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Спасибо всем! Решил. Сделал так: Поле ID сделал 0 по дефолту. Код: plaintext 1. 2. 3. 4. 5. 6. 7. и так по всем полям. Задачка несколько спессфисская - в табличку пишет одна железяка через ODBC, читают многие, удалять из неё низзя, непрерывность поля ID тому лишнее подверждение. Дубли же появлялись при сбоях на принимающей с железяки машине - железяка тогда из буффера вываливала все, не взирая на то, что половина уже принята и в базу прописана. Дыры меня лично не пугали, у народа лишние вопросы появлялись :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 13:44 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
IgorLДыры меня лично не пугали, у народа лишние вопросы появлялись :) Если дыры не волнуют, то какая тогда разница, инкрементируется генератор, или нет? Чего ради? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 13:48 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Мимопроходящий Если дыры не волнуют, то какая тогда разница, инкрементируется генератор, или нет? Чего ради? OFF TOP Код: plaintext 1. 2. 3. 4. 5. 6. 7. Вопрос заказчика - "Где ещё 7 записей???" Ответ: "Генератор напрасно инкрементируется в случае попытки повторного инсерта существующей записи" будет неправильно понЯт :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 14:26 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Монопенисуально. Всё равно, если железяка сбойнёт, получишь дырку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 14:36 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
ты в отчете генерируй нумерацию сам. а показывать пользователю айди это дурной тон имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 14:38 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Господа! Спасибо за ответы, приятно поражен скоростью и точностью их! ТО Мимопроходящий: Сбой железа - не моя проблема, у меня нумерация монотонно возрастает, то есть потерь на уровне софта, вроде, как будто, нет :) Убеждать каждого, да ещё и в специфической (типа военной) организации ИМХО бесполезно. Может даже и поймут, но сомнения останутся. Зачем мне это??? ТО alex_k : К сожалению админ конторы в состоянии ручками набить SELECT * FROM ... Выдавать при таком раскладе левую нумерацию, IMHO ещё хуже. Другой вопрос всесто фактически автоинкремета можно забабашить какую нить мудрую уникальную последовательность... Да подлиннее ;) Типа MD5 из всех полей суммарно... Но ЛЕНЬ. И зачем? И так неплохо. Думаю темка себя исчерпала... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2004, 14:58 |
|
||
|
Не давать вставить дубликат
|
|||
|---|---|---|---|
|
#18+
Могу предложить еще один способ. Писать с железки не в основную таблу, а в аналогичную буферную. По таймеру или по событию (например по количеству записей) переписывай данные в основную через ХП с предпроверкой уникальности, стирая ессно в буферной. Поскольку в этом случае писать может только эта ХП то пройдет способ с max(id)+1. Гоморойнее, конечно, но дыр не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2004, 08:57 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32384366&tid=1579343]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 417ms |

| 0 / 0 |
