如何使用 HSQLDB 在 table 中添加多个列?
How to add multiple columns in a table with HSQLDB?
我一直在尝试使用带有 HSQLDB 的 ALTER TABLE 命令将 2 列添加到 table 但没有成功。我知道 MySQL 和其他系统支持它,但为什么 HSQLDB 不支持它?也许我使用了错误的语法,我不知道。我也知道我可以一个接一个地添加它,但是我的应用程序需要添加 1000 列,而且一个接一个地添加它太慢了。
我使用 HSQLDB 的原因是我需要在文件模式下使用它。我也试过SmallSQL,但是比HSQLDB慢多了。
为此您不需要数千列。这是三个 table 之间的标准一对多关系:questionaire
、question
和 answer
:
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 函数)
我一直在尝试使用带有 HSQLDB 的 ALTER TABLE 命令将 2 列添加到 table 但没有成功。我知道 MySQL 和其他系统支持它,但为什么 HSQLDB 不支持它?也许我使用了错误的语法,我不知道。我也知道我可以一个接一个地添加它,但是我的应用程序需要添加 1000 列,而且一个接一个地添加它太慢了。
我使用 HSQLDB 的原因是我需要在文件模式下使用它。我也试过SmallSQL,但是比HSQLDB慢多了。
为此您不需要数千列。这是三个 table 之间的标准一对多关系:questionaire
、question
和 answer
:
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 函数)