Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库中一列的多个值_Java_Database - Fatal编程技术网

Java 数据库中一列的多个值

Java 数据库中一列的多个值,java,database,Java,Database,是否可以在数据库列中存储多个值。如果是,我应该使用哪种类型?如何通过java代码插入值 例如,我想有一个列“语言”,它可以存储一个行的值,如java、C++、c++等。 编辑:我希望有一个名为student的表,其中包含有关学生的所有信息,并有一列存储他所知道的语言名称。您应该创建一个包含所有不同语言的表“language”,然后使用外键从另一个表中的LanguageID列链接到此表 编辑:如果您希望给定记录使用一种以上的语言,则还需要创建一个链接表,将记录链接到给定的LanguageID。然后

是否可以在数据库列中存储多个值。如果是,我应该使用哪种类型?如何通过java代码插入值

例如,我想有一个列“语言”,它可以存储一个行的值,如java、C++、c++等。 编辑:我希望有一个名为student的表,其中包含有关学生的所有信息,并有一列存储他所知道的语言名称。

您应该创建一个包含所有不同语言的表“language”,然后使用外键从另一个表中的LanguageID列链接到此表


编辑:如果您希望给定记录使用一种以上的语言,则还需要创建一个链接表,将记录链接到给定的LanguageID。然后,通过在链接表中创建新记录,您可以为给定的记录输入任意数量的不同语言。

是指只能使用某些值的枚举,还是指在一列中为给定行存储多个值

列举 多值 不要这样做,而是使用多对多关系:

table whatever (
  id int
);
table language (
  id int,
  name varchar(256)
)
table whatever_language)(
  whatever_id int,
  language_id int
)
-- don't forget foreign key constraints

我认为Zack的回答是正确的,但是如果您确实需要在数据库行中存储多个值,您可以使用VARCHAR类型并使用“;”之类的分隔符来分隔这些值,但是在添加/编辑这些值以正确解析它们时必须小心


或者,如果您使用的是Oracle数据库,您可以将列的类型定义为数组,但这是一个适当的解决方案,它会产生太多的依赖关系,我不建议您这样做。

您需要创建一个Zack提到的语言表,其中表示每种语言,然后有一个表将它们链接到,例如(其中u替换为原始表名)


此链接表将有一个增量索引作为其主键,并将有一个语言表和原始表的外键。如果您了解数据库设计,并且希望摆脱此附加语言表,则原始表中所需的每种语言在链接表中都可以有多行

通常的“好”方法是使用字符串

在字符串中保留类似于“en-en”(第一个国家,第二种语言变体)的ISO语言代码以及分隔符标记,显然空格可能是一个很好的标记,以便“en-de-de”表示英语和德语

然后可以在此字符串列上使用“like”运算符进行复杂的多语言匹配


当你是专业人士并且知道你在做什么时,你可以称之为优化。如果你是新手,那么你显然不知道你做了什么以及关系数据库系统中的“关系”是什么意思。

在一列中存储多个值通常不是一个好主意,因为它违反了优化的原则

从您的描述来看,这听起来像是一种多对多关系。通过在一列中存储多个值来实现这一关系,将迫使您在需要更新列或使用某种语言进行查询时付出比必要更大的努力

从技术上讲,可以考虑一种变通方法(例如,正如Telcontar所建议的),但我建议阅读一些关于不同范式的内容,并重新考虑数据库设计。

使用联接表(也称为链表)来定义n-m关系

用户表(伪SQL):

语言表(伪SQL):

用户和语言的联接表(伪SQL):

通过这种方式,您可以通过用户ID(以及绑定到特定语言的所有用户)获取所有语言。一些RDBMS支持将这些值作为SQL数组类型进行检索,您可以通过单个查询获取这些值。例如,在PostgreSQL中,您可以执行以下查询:

SELECT u.id, u.name, ARRAY(
    SELECT l.name
    FROM language l
    JOIN user_language ul ON u.id = ul.user_id
    WHERE l.id = language_id) AS languages
FROM user u
您可以在JDBC中如下处理:

while (resultSet.next()) {
    Long id = resultSet.getLong("id");
    String name = resultSet.getString("name");
    Object[] languages = resultSet.getArray("languages").getArray();
    // Cast to String[] or convert to List<String> or so yourself.
}
while(resultSet.next()){
Long id=resultSet.getLong(“id”);
字符串名称=resultSet.getString(“名称”);
Object[]languages=resultSet.getArray(“语言”).getArray();
//转换为字符串[]或自己转换为列表。
}

您所说的是表(您没有给出名称)和语言之间的多对多关系。
假设您的表格是关于人的,您希望跟踪哪些人精通哪些语言。
任何给定的人都将精通一门(可能为零)一种或多种语言。若要对此建模,您需要三个表:Person、Language和链接这两个表的第三个表,可能是LanguageExperience,它引用了一个人和一种语言。在此表中,同一个人或同一种语言可以有多行,但每个人和语言的唯一组合只能有一个条目语言(即,这两列构成此表的主键)


这里使用第三个表的优点(与其他一些建议相比,例如将它们连接到文本字段中)是因为它很容易扩展到包括其他属性,例如一个人使用该语言的年数,或一种语言的掌握程度评级,或一些测试分数。这些都是你想知道的关于一个人和一种语言的每个组合的事情,所以它属于语言熟练程度表。

嗯,更像是一个如果你想允许每行超过一个值,那么这两个表就链接在一起。这不解决OP对一对多关系的请求(“java、C++、C等的存储值,对于单个行”)。我认为“多值”是指“不同的值”。,对于给定的记录,不超过1个值。如果是这种情况,则使用链接表。如果有一组在运行时不会更改的固定语言,则不需要“语言”表。您可以在java中使用语言枚举,在数据库中插入序号,并进行检查
CREATE TABLE language {
    id INTEGER GENERATED PRIMARY KEY,
    name VARCHAR
}
CREATE TABLE user_language {
    user_id INTEGER FOREIGN KEY REFERENCES user(id),
    language_id INTEGER FOREIGN KEY REFERENCES language(id)
}
SELECT u.id, u.name, ARRAY(
    SELECT l.name
    FROM language l
    JOIN user_language ul ON u.id = ul.user_id
    WHERE l.id = language_id) AS languages
FROM user u
while (resultSet.next()) {
    Long id = resultSet.getLong("id");
    String name = resultSet.getString("name");
    Object[] languages = resultSet.getArray("languages").getArray();
    // Cast to String[] or convert to List<String> or so yourself.
}