插入、替换/更新 JDBC

Posted

技术标签:

【中文标题】插入、替换/更新 JDBC【英文标题】:Insert, Replace/Update JDBC 【发布时间】:2016-01-13 09:00:13 【问题描述】:

我想要一个存储所有用户投票的数据库。例如,假设用户 ABC 在问题 Y 上选择 X。然后同一用户 ABC 决定对单独的问题进行投票,并在问题 Z 上选择 V。每次用户按下提交按钮时,信息都会添加到数据库中.假设几天后,同一用户 ABC 决定更改其投票之一,因此他返回问题 Y,但这次选择 W,而不是 X。应避免新条目,而应避免使用旧条目应该使用新选择进行更新。

我的 Votes 表包含所有选票和用户以及所有选择:

CREATE TABLE Votes(
  id integer,
  username varchar(16),
  option varchar(16)
)

我尝试了不同的方法,但都没有成功。

【问题讨论】:

还有一个 users 表,并且在 Votes 表中只存储 userid。仅按行和用户投票。 id 不是用户 id,在我的例子中 id 是用户投票的问题的 id。 我知道。我的意思是存储用户 ID 而不是用户名。 【参考方案1】:

在您开始实施这些类型的数据库连接之前,最好先考虑一个图表,以帮助您了解如何组织您的数据库表。关系模型是一个伟大而简单的开始方式。您必须查看您拥有的实体类型,在这种情况下是用户和问题。这些实体将分别代表一个表。一个用户对一个问题进行投票,并且由于许多用户可以对每个问题进行投票,并且每个用户可以对许多问题进行投票,因此这些实体“投票”之间的关系也必须有一个表。我们有 3 张桌子。用户表应该有它的 id 和你认为合适的用户数据,id 是它的主键。问题表应该有它的 id 和你认为合适的用户数据,它的 id 作为主键。在投票表上,您应该有用户的 id 和投票的问题的 id 以及您在那里拥有的任何其他数据。用户 id 和问题 id 将在此处形成一个压缩的主键。这样,通过访问投票表,您将能够知道哪个用户对每个问题进行了投票,以及哪个问题是由哪个用户投票的,等等...

【讨论】:

【参考方案2】:

我认为您应该在表格中再添加一个字段以供提问。

当您在您的应用程序/数据库中执行此操作时,您应该检查该用户是否有包含问题和答案的行,如果是,则更新表或如果该行不存在则插入。

【讨论】:

id in my table 是问题。我只是使用 ids 而不是整个问题,让它更干净一些 Id 名称与问题没有共同点,因此表格投票也不清楚。但是好的,现在您必须为您的用户从表中获取所有内容并以相同的方式检查它:)【参考方案3】:

如下更改您的表格:CREATE TABLE votes ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) DEFAULT NULL, question_id bigint(20) DEFAULT NULL, option varchar(255) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY user_id (user_id,question_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

在插入新记录之前,您应该检查用户是否已通过 select * from votes where user_id = ? and question_id = ? limit 1

回答了此问题

如果有记录存在,更新它,或者插入一条新记录;

【讨论】:

我该怎么做?如,将用户名和问题设置为联合唯一键。 OP 没有使用 mysql,在 MySQL 中你实际上可以使用 insert .. on duplicate 我觉得换成标准sql就行了。

以上是关于插入、替换/更新 JDBC的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 复制命令追加、替换或更新插入?

XQuery 更新:插入或替换取决于节点是不是存在不可能?

是否有“如果不存在则更新插入”(如 MySQL 中的替换)? [复制]

AWS Glue to Redshift:是不是可以替换、更新或删除数据?

JDBC插入数据实例

mysql-插入更新删除数据