Mysql更新如果存在则插入(如果不存在)

时间:2015-11-15 19:30:27

标签: mysql

您好我有一个名为" 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查询创建它。

由于

3 个答案:

答案 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