Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
Всем доброго дня,

в одном из проектов обнаружил проблему, одновременное наличие индексов с одинаковыми полями в PK и в unique индексах одновременно. Если данных в таблице нет то это прокатывало. Если данные есть то при создании PK индекса вываливало ".... violation of PRIMARY or UNIQUE KEY constraint "PK_INDEXNAME" on table "TABLENAME".
Понятно что была допущена ошибка и нужен только один из индексов. Но стало интересно почему создание PK не прошло? По идее оба индекса независимы и хоть это не оптимально должно было бы функционировать. Таблицу проверил, повторяющихся ключей в ней нет (да и как они там могли быть если уникальный индекс уже существовал)

Спасибо.
29 окт 21, 11:00    [22389778]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hvlad
Member

Откуда:
Сообщений: 11555
hlopotun
Таблицу проверил, повторяющихся ключей в ней нет (да и как они там могли быть если уникальный индекс уже существовал)
UNIQUE иначе работает с нуллами, чем PK.
В сообщении об ошибке есть значения полей.
Если сборка мусора заблокирована, то дубликаты в бекверсиях\удалённых записях когда-то могли мешать проверке уникальности. Это исправлялось, но я не вижу тут точной версии FB.
29 окт 21, 11:11    [22389785]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
hvlad,

2.5.8
29 окт 21, 11:21    [22389794]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
да, забыл добавить, все поля входящие в индексы как not null маркированы.
29 окт 21, 11:23    [22389795]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
DDL:
+

/******************************************************************************/
/****              Generated by IBExpert 29.10.2021 10:24:29               ****/
/******************************************************************************/

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE PROALOCK (
    PRONR     VARCHAR(20) NOT NULL,
    TYP       INTEGER NOT NULL,
    ANGNR     VARCHAR(50) NOT NULL,
    S1        DOUBLE PRECISION NOT NULL,
    S2        DOUBLE PRECISION NOT NULL,
    S3        DOUBLE PRECISION NOT NULL,
    S4        DOUBLE PRECISION NOT NULL,
    S5        DOUBLE PRECISION NOT NULL,
    STUFE     INTEGER,
    UNR       INTEGER,
    USERNAME  VARCHAR(100) NOT NULL,
    DT        TIMESTAMP NOT NULL
);



/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE PROALOCK ADD CONSTRAINT PK_PROALOCK PRIMARY KEY (PRONR, TYP, ANGNR, S1, S2, S3, S4, S5);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX PROALOCK_MEUSR ON PROALOCK (PRONR, TYP, USERNAME, ANGNR, S1);
CREATE UNIQUE INDEX PROALOCK_PRIMARY ON PROALOCK (PRONR, TYP, ANGNR, S1, S2, S3, S4, S5);
CREATE INDEX PROALOCK_USRANG ON PROALOCK (PRONR, TYP, USERNAME, ANGNR);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: ETR_PROANGLOCK */
CREATE OR ALTER TRIGGER ETR_PROANGLOCK FOR PROALOCK
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
BEGIN
  post_event 'proalock';
END
^
SET TERM ; ^



/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/

29 окт 21, 11:25    [22389799]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
hvlad,

а как правильно проверить заблокирована сборка мусора или нет?
29 окт 21, 11:28    [22389801]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hvlad
Member

Откуда:
Сообщений: 11555
hlopotun
hvlad,

а как правильно проверить заблокирована сборка мусора или нет?
Посмотреть, движется ли OST при старте тр-ции.
Или проверить наличие старой активной тр-ции, кроме read committed read only.
29 окт 21, 12:02    [22389829]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hvlad
Member

Откуда:
Сообщений: 11555
hlopotun
да, забыл добавить, все поля входящие в индексы как not null маркированы.
Есс-но, иначе создание PK обломилось бы гораздо раньше.

Никогда не сравнивай на равенство double precision. Тем более 5 шт. сразу.

PS индекс PROALOCK_USRANG не нужен, он полностью продублирован индексом PROALOCK_MEUSR
29 окт 21, 12:09    [22389837]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
ggreggory
Member

Откуда:
Сообщений: 200
Не знал, что double precision можно включать в первичный ключ... это что-то невообразимое.
29 окт 21, 12:21    [22389846]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896
ggreggory
это что-то невообразимое.
регулярно всплывает.
и столь же регулярно вызывает бурную реакцию окружающих.
как натрий в воду.
29 окт 21, 12:33    [22389860]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
Первичный ключ из восьми полей для меня из области фантастики. Как записи искать?
29 окт 21, 12:45    [22389866]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54804

Мимопроходящий
регулярно всплывает.

Это в основном безопасно. Во всех языках кроме Дельфи. Аффтару очень точно
удалось найти единственные грабли посреди Сахары.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 12:48    [22389867]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 1119
KreatorXXI,

а если надо будет эту таблицу связывать с другой? Восемь полей тащить в другую таблицу? В каких книжках пишут такие рекомендации?
29 окт 21, 12:50    [22389872]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 63467
Ну, эта тема много раз обсуждалась, но 8 полей я не припомню, да.

P.S. Я даже к PK из двух полей отношусь с подозрением, мягко говоря.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 13:23    [22389899]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
Гаджимурадов Рустам
Ну, эта тема много раз обсуждалась, но 8 полей я не припомню, да.

P.S. Я даже к PK из двух полей отношусь с подозрением, мягко говоря.

когда то в одной конторе работал, там местный разработчик баз только составные первичные ключи использовал. Там бывало и поболее 8ми полей, ну конечно не double. Проект правда не взлетел, заказчик загнулся раньше.
Попробую разобраться зачем человек такой ключ сделал. Меня просто попросили причину ошибки найти. Я даже пока незнаю назначение этой таблицы. Из названия какой то лог.
29 окт 21, 14:38    [22389940]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
hlopotun
Member

Откуда:
Сообщений: 675
[quot hlopotun#22389940]
Гаджимурадов Рустам
Ну, эта тема много раз обсуждалась, но 8 полей я не припомню, да.

P.S. Я даже к PK из двух полей отношусь с подозрением, мягко говоря.

когда то в одной конторе работал, там местный разработчик баз только составные первичные ключи использовал. Там бывало и поболее 8ми полей, ну конечно не double. Проект правда не взлетел, заказчик загнулся раньше.
Попробую разобраться зачем человек такой ключ сделал. Меня просто попросили причину ошибки найти. Я даже пока незнаю назначение этой таблицы. Из названия какой то блокировщик.

Сообщение было отредактировано: 29 окт 21, 14:45
29 окт 21, 14:44    [22389944]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30261
hlopotun
а как правильно проверить заблокирована сборка мусора или нет?

в mon$attachments у этого коннекта столбец MON$GARBAGE_COLLECTION будет равен 0.\

индексы PROALOCK_PRIMARY и PROALOCK_USRANG надо удалить к чертям, они лишние.
Про ПК из 8 столбцов и double precision в индексе уже сказали.

Обычно, если эти 8 столбцов действительно представляют собой "идентификатор", делают так:
в таблицу вводят суррогатный ПК (числовой ID, заполняемый генератором или как IDENTITY).
На 8 столбцов вводят уникальный констрейнт (не индекс, индекс по констренту будет создан автоматом).
Но вообще уникальность по 8 столбцам - это дичь.
29 окт 21, 15:12    [22389958]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 1134
Гаджимурадов Рустам
Ну, эта тема много раз обсуждалась, но 8 полей я не припомню, да.

P.S. Я даже к PK из двух полей отношусь с подозрением, мягко говоря.


Это из области холивара насчёт естественных и искусственных. Двухсегментные имхо вполне имеют право на жизнь по Оккаму. Скажем, архив событий невысокой интенсивности - ID сущности и таймштамп действа. Нафига там ещё создавать ID самой архивной записи. При высокой интенсивности, конечно, рано или поздно наступишь на дискретность времени. Или хранимые агретаты - ID сущности, ID периода, в атрибутах сумма и прочая считаемая фигня. Можно ещё что-нибудь вспомнить специфическое. Но в целом ноги многосегментных PK растут из времён когда деревья были большими ужасающе медленный по нынешним понятиям диск в 1Гб был вершиной технического прогресса, а ОЗУ 512Мб позволяли себе только сумасшедшие миллионеры. Приходилось экономить на спичках и не плодить "лишних" индексов. Я тогда немало всяких чудес сотворил. Потом, конечно, пришёл к целостности на ID и всей естественности даже не на UK, а просто на уникальных индексах. Но данный конкретной случай, конечно, патология.
29 окт 21, 15:21    [22389961]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
ggreggory
Member

Откуда:
Сообщений: 200
Dimitry Sibiryakov

Во всех языках кроме Дельфи.


Дельфи-то тут каким боком. Это архитектура процессора.
29 окт 21, 16:59    [22390021]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54804

ggreggory
Дельфи-то тут каким боком.

Оно "под капотом" округляет плавающие числа, отбрасывая младший бит.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 17:11    [22390028]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896
Dimitry Sibiryakov
Оно "под капотом" округляет плавающие числа, отбрасывая младший бит.
зачем?
29 окт 21, 17:13    [22390031]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54804

Мимопроходящий
зачем?

Чтобы не пугать дельфинов граблями типа 0.2 + 0.2 <> 0.4, на которых ловятся
сишники. Учебный же язык.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 17:18    [22390034]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
ggreggory
Member

Откуда:
Сообщений: 200
Dimitry Sibiryakov

ggreggory
Дельфи-то тут каким боком.

Оно "под капотом" округляет плавающие числа, отбрасывая младший бит.


Чушь какая. Кто вам такое сказал? И что такое "младший бит вещественного числа"? :D
29 окт 21, 17:52    [22390070]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54804

ggreggory
Кто вам такое сказал? И что такое "младший бит вещественного числа"? :D

Исходники. Младший бит мантиссы.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 18:49    [22390111]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
ggreggory
Member

Откуда:
Сообщений: 200
Dimitry Sibiryakov

ggreggory
Кто вам такое сказал? И что такое "младший бит вещественного числа"? :D

Исходники. Младший бит мантиссы.


Отбрасывание младших битов мантиссы приводит не к округлению, а к уменьшению числа. Т.е. в результате расчетов вы будете получать ДРУГОЕ число. Хотя бы из этих соображений ваш пост про младший бит - бред.

Про исходники я молчу. Как в исходниках можно что-то увидеть? увидеть можно только в бинарном коде или его ассемблерном представлении.
29 окт 21, 19:45    [22390146]     Ответить | Цитировать Сообщить модератору
 Re: FB 2.5 одинаковые PK и UNIQUE индексы с одинаковыми полями в одной таблице одновременно  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54804

ggreggory
Отбрасывание младших битов мантиссы приводит не к округлению, а к уменьшению числа.

Домашнее задание: сравни в Дельфи два числа с плавающей точкой, отличающиеся
только младшим битом мантиссы.

Posted via ActualForum NNTP Server 1.5

29 окт 21, 20:14    [22390149]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить