crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как работать с таблицей, содержащей уникальный набор значений типа double?
Steklova Olga
  опции профиля:
сообщение 11.6.2013, 10:18
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Всем привет :)
В таблице БД FireBird надо хранить массивы значений F_FR для разных объектов (TO_F_OBJ_NMB - номер объекта).
Значения содержат 1..6 цифр в целой части, 2 цифры в дробной части, значения положительные.
Для конкретного объекта массив F_FR не должен содержать повторяющиеся значения.


Таблица создана так
--TABLE T_OBJ_FR может содержать 0...100 значений F_FR для каждого TO_F_OBJ_NMB
CREATE TABLE T_OBJ_FR (
    F_RECORD_NMB     INTEGER NOT NULL, --генератор
    TO_F_OBJ_NMB     INTEGER NOT NULL, --внешний ключ
    F_FR             DOUBLE PRECISION NOT NULL
);
ALTER TABLE T_OBJ_FR ADD CONSTRAINT PK_T_OBJ_FR PRIMARY KEY (F_RECORD_NMB);

Для корректировки таблицы T_OBJ_FR использую диалог,
в котором для корректировки поля F_FR использую doubleSpinBox.

Мне непонятно вот что:
1) можно ли создать уникальный ключ, содержащий поле типа DOUBLE PRECISION? (например, создать уникальный ключ (TO_F_OBJ_NMB, F_FR))
2) если не создавать уникальный ключ, то как проверить, есть ли уже в таблице только что введенное оператором в doubleSpinBox значение F_FR? (как написать SELECT?)
3) не лучше ли будет описать поле F_FR как NUMERIC(8,2), а не DOUBLE PRECISION?
4) можно ввести значение типа NUMERIC(8,2) с помощью doubleSpinBox?
5) можно создать уникальный ключ, содержащий поле типа NUMERIC?

Сообщение отредактировал Steklova Olga - 13.6.2013, 9:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 13.6.2013, 11:18
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Litkevich Yuriy, большое спасибо за ответ :)

Цитата(Алексей1153 @ 11.6.2013, 11:59) *
варианты удобного, на мой взгляд, ключа:
1) текстовый с фиксированным форматом "000000.00"
2) целый (10 знаков)
это неудобно

Добавила уникальный ключ
ALTER TABLE T_OBJ_FR ADD CONSTRAINT UK_T_OBJ_FR__OF UNIQUE (TO_F_OBJ_NMB, F_FR);

Работает. Только, чтобы все было корректно, надо при работе с полем F_FR всегда использовать одинаковое кол-во цифр в дробной части (в моем случае - две).
Иначе может получиться вот что.
Например:
в tableView для поля F_FR укажем отображать 2 цифры в дробной части,
для dblSpinBox для корректировки значения F_FR укажем setDecimals(2).
Если оператор выполнит скрипт заполнения таблицы, указав (по ошибке) для значений F_FR не 2, а 3 цифры в дробной части,
INSERT INTO T_OBJ_FR (TO_F_OBJ_NMB, F_FR) VALUES ( 1, 1.11);
INSERT INTO T_OBJ_FR (TO_F_OBJ_NMB, F_FR) VALUES ( 1, 1.114);
INSERT INTO T_OBJ_FR (TO_F_OBJ_NMB, F_FR) VALUES ( 1, 1.117);
то в tableView он увидит значения 1.11, 1.11, 1.12, по внешнему виду нарушающие уникальность,
к тому же оператор сможет добавить в эту таблицу значение F_FR, равное 1.12.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 7:43