Несколько вопросов по работе с базой.

Автор Kildor, 1 сентября 2011, 18:46

0 Пользователи и 1 гость просматривают эту тему.

Kildor

Сабж. LibreOffice 3.4.3


1. Хранение файлов в базе. Насколько hsqldb устойчива к работе с тяжёлыми файлами? То есть, какой размер базы ещё позволяет нормально с ней работать?

2. есть две таблицы. Table1 {t1_id, ...}, Table2 {t2_id, field1, field2}
Пытаюсь настроить связи между таблицами, хочу связать t1_id и field1, а также t1_id (естественно другую строку) с field2. Сервис » Связи позволяет это сделать, даже отображает, но при сохранении теряет одну из связей. Что я делаю не так?

3. Запросы и представления. Тут уже явно не base, а SQL чистой воды.
Есть структура из следующих таблиц:

t_marker {m_id, m_name}
t_example {e_id, e_name}
t_seq {s_id, s_m_id, s_e_id, s_seq}
Где соответственно s_m_id и s_e_id связи с соответствующими ключами.
Нужно сделать следующую таблицу:
m_name | s_seq (s_m_id==m_id && m_name=="1") |  s_seq (s_m_id==m_id && m_name=="2") |

То есть, одну ячейку поместить в два столбца, в зависимости от имени m_name. При этом, s_seq может и не быть, но нужно показать все строки из t_example, вне зависимости от этого факта.

Понимаю, что нужно работать через outer join, но
SELECT "DNA-s"."Number", "Snails"."SnailStringID", CASE WHEN "COI"."Sequence" IS NULL THEN '' ELSE '+' END AS "COI", CASE WHEN "ITS"."Sequence" IS NULL THEN '' ELSE '+' END AS "ITS-S" FROM "DNA-s", "Snails", "Markers"
LEFT JOIN "Sequences" AS "COI" ON "COI"."DNAID" = "DNA-s"."DNAID" AND "COI"."MarkerID"="Markers"."MarkerID" AND "Markers"."MarkerName"='COI'
LEFT JOIN "Sequences" AS "ITS" ON "ITS"."DNAID" = "DNA-s"."DNAID" AND "ITS"."MarkerID"="Markers"."MarkerID" AND "Markers"."MarkerName"='ITS-S'
WHERE "DNA-s"."SnailID" = "Snails"."SnailID" ORDER by "DNA-s"."Number" ASC;

Выдаёт пустую таблицу, хотя по отдельности работает корректно. (запрос взят из рабочей базы, но надеюсь что идея понятна).

5. Можно ли расширить следующий пример, но задавать столбцы не вручную, а пройтись по тому, что есть в таблице marker автоматически?

RFJ

1. hsqldb на "тяжелых" файлах я бы использовать не стал, лучше PostgreSQL или что-то подобное.

2. Составлять по вашему описанию таблицы с данными нет ни времени ни желания. Приложите пример вашей БД и конкретно  покажите, что вам нужно.

Kildor

1. Понял. А сконвертировать с hsqldb в PostgreSQL насколько сложно?
Ок. Таблица во вложении.

2. Таблица Sequences, поля PrimerForwardID и PrimerReverseID. Хотелось бы чтоб они связывались с таблицей Primers.
3. Собственно код описывает что хочется получить. Запрос «test_1»

[вложение удалено Администратором]

RFJ

Все равно ничего не понятно, что вы хотите.

Что-то вроде этого?

[вложение удалено Администратором]

Kildor

Да, почти.
Хочется получить подобное вот этому:

SnailStringIG as name
name    | COI | ITS |
nenk-01 |  +  |  +  |
nenk-02 |     |  +  |
nenk-03 |  +  |     |
nenk-04 |     |     |

Отображены все SnailStringID, вне зависимости от того, есть ли соответствующие им записи в таблице Sequences.

RFJ

Приложенный вами пример не соответствует вашим требованиям, например, отсутствуют nenk-03 и nenk-04, или, непонятно, откуда эта строка
name    | COI | ITS |
nenk-01 |  +  |  +  |

Alexandr Polbin

Возможно ли выполнение запросов на обновление в BASE? Пишу запрос SQL:
Обновить пустое поле DATEADD в таблице REGISTR текущей датой

UPDATE REGISTR SET DATEADD = NOW WHERE DATEADD IS EMPTY
А комп выдает, что возможно только выполнение инструкции на выборку SELECT...
Как по другому можно решить эту проблему?
Задать значение текущей даты в самой таблице по умолчанию тоже не получается.

rami

Цитата: Alexandr Polbin от 12 февраля 2017, 13:15UPDATE REGISTR SET DATED = NOW WHERE DATED IS EMPTY
Где вы берёте такой код? Из Access? Ищите ответы на ваши вопросы на нашем форуме (но не в ошибках новичков, а в правильных ответах), читайте документацию по соответствующей базе.
Цитата: Alexandr Polbin от 12 февраля 2017, 13:15Задать значение текущей даты в самой таблице по умолчанию тоже не получается.
Попробуйте (названия таблиц и полей надо брать в кавычки):
ALTER TABLE "REGISTR" ALTER COLUMN "DATEADD" SET DEFAULT TODAY

economist

Kildor - забудьте про HSQL - это нерабочий вариант. Для себя давно решил что только SQLite через ODBC. А на вырост - встроенная FireBird3 или PostgreSQL через ODBC.

Alexandr Polbin - в Base есть 3 варианта запуска SQL-запросов:
1) Конструктор запросов с отжатой SQL
2) Конструктор запросов с нажатой SQL
3) Сервис - SQL

DDL-запросы "просятся" в третий вар-т или во второй.

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Alexandr Polbin

Вообще, информацию брал в "Синтаксисе языка SGL".
На "ALTER TABLE "REGISTR" ALTER COLUMN "DATEADD" SET DEFAULT TODAY" тоже выдает синтаксическую ошибку.
А в режиме дизайна запросов я функции обновления что-то не нашел, может она называется как-то по-другому...

Alexandr Polbin

При запуске последней команды через сервис SQL пишет "Команда выполнена успешно", но поля в таблице не обновляются...
И как потом сделать, чтобы эта команда выполнялась каждый раз при добавлении в таблицу новой записи?

rami

Цитата: Alexandr Polbin от 12 февраля 2017, 16:43
При запуске последней команды через сервис SQL пишет "Команда выполнена успешно", но поля в таблице не обновляются...
И как потом сделать, чтобы эта команда выполнялась каждый раз при добавлении в таблицу новой записи?
Эта команда устанавливает текущую дату по умолчанию, если в поле ничего не записано. Я дефолтные поля в форме ввода не отображаю.

Каждый раз не надо выполнять.

economist

#12
Alexandr Polbin - чтобы увидеть изменения в Таблицах - нужно их обновить вручную: Вид - Обновить таблицы.  

Чтобы "команда выполнялась каждый раз при добавлении в таблицу новой записи" - курите триггеры. Но искренне надеюсь что вы это делаете не в HSQLDB. Иначе число проблем будет расти в геометрической прогрессии и всё равно приведет к отказу от HSQL в пользу чего угодно другого.

За SQLite ч/з ODBC/unixODBC - скажу что это самая быстрая база из всех RDBMS при работе с нею до 3-х человек по сети 100/1000 Гбит, да-да, в режиме файлового доступа. Плюс не нужны кавычки, как в примерах выше, и работает кириллица в таблицах, полях, псевдонимах.

OpenOffice|LibreOffice - разработчики могли бы использовать SQLite как основную RDBMS в Base. Но тогда из BASE получится 99% "убийца" Microsoft Access (12 тыс. руб.). А это, по теории заговора, кому-то не очень чтобы и нужно.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: economist от 13 февраля 2017, 09:31
OpenOffice|LibreOffice - разработчики могли бы использовать SQLite как основную RDBMS в Base. Но тогда из BASE получится 99% "убийца" Microsoft Access (12 тыс. руб.). А это, по теории заговора, кому-то не очень чтобы и нужно.

Здесь описана история вопроса (причины заговора указаны начиная с комментария 19).
С уважением,
Михаил Каганский

economist

#14
mikekaganski - спасибо за ссыль, с удовольствием прочитал и воспрял духом.

Во-первых, FireBird3 - это хорошо, если даже не сказать прекрасно. Есть и документация на русском, и IDE от InterBase итд. FB быстрее HSQL в 3-5 раз, могу поискать пруф. Но всё это не повторит успеха "малопользовательского" MS Access, который основан на его безсерверной (читай - простой) природе. Именно это есть и у SQLite. "No admin", что называется.

Во-вторых, в тот треде - наглая ложь про сопоставимую скорость HSQLDB и SQLite. Предлагаю просто поверить мне на слово. У HSQLDB скорость в 3-4 раза ниже, чем у SQLite.  

В-третьих, динамическая, а если точнее "утиная", "предлагаемая" типизация, применяемая в SQLite, Python, LUA итд - это как раз неимоверное благо. Вcё равно в коде люди реализуют проверки, CAST в SQL быстр, а сохранение всего как текст - вовсе не так уж плохо. Главное - что оно всегда работает и не вызывает никаких сбоев.

Вот такая фирма как 1С в своем продукте Предприятие 7.7 (1995-2018 гг) - все числовые коды хранит как текст, и ничо.

 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...