您好我有一个名为" distribuzioni"它以这种方式组成:
stmt.executeUpdate("CREATE TABLE distribuzioni " +
"(id INTEGER primary key auto_increment, " +
"nazione TEXT NOT NULL, " +
"categoria TEXT NOT NULL, " +
"risultato TEXT NOT NULL, " +
"densita FLOAT(3,2))");
现在,假设我的Java项目中有这四个参数:
String nation="USA";
String category="First Division";
String result="2-1";
float density=0.34;
现在我想要更新参数densita =我的distribuzioni数据库的密度,如果它有一行包含nazione = nation,categoria = category,risultato = result。
如果我的数据库中没有包含nazione = nation,categoria = category,risultato = result的行,我想用densita = density和INSERT查询创建它。
由于
答案 0 :(得分:1)
首先,我必须说你继续说database
。你的意思是table
。
CREATE TABLE distribuzioni
( id int primary key auto_increment,
nazione varchar(100) NOT NULL,
categoria varchar(100) NOT NULL,
risultato varchar(100) NOT NULL,
densita FLOAT(3,2),
unique key(nazione,categoria,risultato) -- this is important
);
让我们从表格中的一些数据开始。
insert distribuzioni(nazione,categoria,risultato,densita)
values ('Italy','fish','thing1',1.23);
select * from distribuzioni;
+----+---------+-----------+-----------+---------+
| id | nazione | categoria | risultato | densita |
+----+---------+-----------+-----------+---------+
| 1 | Italy | fish | thing1 | 1.23 |
+----+---------+-----------+-----------+---------+
这是上面的数据。一个起点。
以下是新数据的输入方式:
insert distribuzioni(nazione,categoria,risultato,densita)
values ('France','cars','thing8',1.11)
on duplicate key update densita=1.11;
insert distribuzioni(nazione,categoria,risultato,densita)
values ('Italy','fish','thi1ng1',5.11)
on duplicate key update densita=5.55;
select * from distribuzioni;
+----+---------+-----------+-----------+---------+
| id | nazione | categoria | risultato | densita |
+----+---------+-----------+-----------+---------+
| 1 | Italy | fish | thing1 | 5.55 |
| 2 | France | cars | thing8 | 1.11 |
+----+---------+-----------+-----------+---------+
重点。如果您没有在这三列上创建唯一的复合键,则更新将不会启动,您将获得另一行不需要的内容。
另外,我只是这样说来为你节省悬疑,每次更新触发时,即使你得到了你想要的更新,它也会在内部增加到表(不是在row)下一个可用的汽车公司编号。这是一个side-effect
。尝试一下,你会明白我的意思。您的数据会很好,但您会得到差距。
以下是Insert on Duplicate Key Update
上的手册页 请记住,如果没有唯一的复合键,这将不起作用。所以不要浪费你的时间,没有它。您问的唯一复合键是什么?显示的Schema中的行旁边是-- this is important
。并且这意味着该表中只能有一行,并将这三个值组合为一个组合。这是使其插入或更新的神奇之处。
答案 1 :(得分:0)
一种可能的方法是为 nazione , categoria , risultato 创建3个链接表,使其主要ID成为您的< em> distribuzioni 表
当你插入它时使用ON DUPLICATE KEY UPDATE
。
答案 2 :(得分:0)
正如@maraca所说,去看看How to 'insert if not exists' in MySQL?
引用:
方法1:使用REPLACE
这很简单:
REPLACE INTO `transcripts` SET `ensembl_transcript_id` = ‘ENSORGT00000000001′, `transcript_chrom_start` = 12345, `transcript_chrom_end` = 12678;
如果记录存在,则会被覆盖;如果它还没有 存在,它将被创建。但是,使用此方法效率不高 对于我们的情况:我们不需要覆盖现有记录,没关系 只是为了跳过它们。
获得auto_inc ID;只是不要把它放在SET
中