如何使用 HSQLDB 在 table 中添加多个列?

How to add multiple columns in a table with HSQLDB?

我一直在尝试使用带有 HSQLDB 的 ALTER TABLE 命令将 2 列添加到 table 但没有成功。我知道 MySQL 和其他系统支持它,但为什么 HSQLDB 不支持它?也许我使用了错误的语法,我不知道。我也知道我可以一个接一个地添加它,但是我的应用程序需要添加 1000 列,而且一个接一个地添加它太慢了。

我使用 HSQLDB 的原因是我需要在文件模式下使用它。我也试过SmallSQL,但是比HSQLDB慢多了。

为此您不需要数千列。这是三个 table 之间的标准一对多关系:questionairequestionanswer:

create table questionaire 
(
  id              integer not null primary key,
  customer_name   varchar(100) not null
);

create table question 
(
  id                integer not null primary key,
  questionaire_id   integer not null references questionaire,
  question_text     varchar(20000),
  sort_order        integer
);

create table answer 
(
  question_id   integer not null references question,
  answer_text   varchar(20000),
  user_name     varchar(50) not null,
  primary key (question_id, user_name)
);

实际上,您实际上不会将用户名存储在 answer table 中。如果您命名了登录用户,您可能还需要 user_account table 并且 question table 将引用 user_account table。

您可以轻松查询此模型,而无需恢复到 key/value 商店或 JSON

获取客户​​的所有问卷

select *
from  questionaire qu
where customer_name = 'Some company';

获取所有问卷和每个客户的问题数量

select qu.customer_name, 
       count(distinct qu.id) as num_questionaires,
       count(q.id) as total_questions
from  questionaire qu
  join question q on qu.id = q.questionaire_id 
group by  qu.customer_name;

从特定用户处获取问卷的所有答案

select q.question_text, a.answer_text
from answer a 
  join question q on q.id = a.question_id 
  join questionaire qu on qu.id = q.questionaire_id 
where qu.id = 1
  and a.user_name = 'Marvin'
order by q.sort_order;

有点复杂,但即使有数千个问题和答案,可能仍然足够快:找到没有回答所有问题的用户

select aq.user_name, aq.questionaire_id, aq.answered_questions, tq.num_questions
from (
  select a.user_name, q.questionaire_id, count(*) as answered_questions
  from answer a 
    join question q on q.id = a.question_id 
  group by a.user_name, q.questionaire_id
) aq join (
     select questionaire_id, count(*) as num_questions
     from question
     group by questionaire_id
  ) tq on tq.questionaire_id = aq.questionaire_id
where aq.answered_questions < tq.num_questions;

SQL小提琴示例:http://sqlfiddle.com/#!15/0a4e5/1


您也不应该尝试将每个问题(或答案)的行转置到 SQL 中的列中 - 您 最终达到一些限制数据库可以管理的列数。关系数据库旨在处理行,很多行 - 而不是 "thousands of column"。将行转列通常在应用程序的表示层中完成(或者例如在电子表格中使用 Pivot 函数)