Lors de l'exécution d'une opération de base de données, "Mettre à jour si ces données ont été INSERTées ou sont prises dans une contrainte UNIQUE, Sinon, je veux INSÉRER " A cette époque, j'avais l'habitude de créer des branches avec Java. Mais si vous utilisez PostgreSQL, il semble que vous puissiez le faire en même temps. Alors je l'ai essayé.
Au fait, il y a pas mal d'informations sur d'autres sites pour une implémentation avec uniquement SQL, donc cette fois je vais utiliser la méthode MyBatis. Cela ne change pas grand-chose, cependant.
L'environnement est le suivant
IDE:Eclipse </>:Java8,SpringBoot <DB related (ligne principale)>: PostgreSQL, MyBatis
Spring Boot et My Batis lui-même, et la coopération avec PostgreSQL ne sont pas les points principaux, je les omettrai donc dans une certaine mesure. Cette fois, c'est Gradle.
Gradle (extrait)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
application.properties (extrait)
<!-- Postgres property -->
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/hrm
spring.datasource.username=*****
spring.datasource.password=*****
Préparez une table dans PostgreSQL. Cette fois, Schema sera public.
PostgreSQL
create table tableName (
id serial primary key,
user_id integer not null,
date_id integer not null,
is_working smallint,
);
alter table tableName add constraint user_date unique(user_id, date_id);
Voici un exemple de cette application. Par exemple, supposons que vous ayez une application qui gère la liste de tâches d'un utilisateur et vérifie si l'utilisateur a terminé une tâche. Insérez 1 pour is_working si la tâche est terminée, et 0 sinon pour un mois de mises à jour. Si vous souhaitez modifier la gestion des tâches de manière rétroactive, ou s'il s'avère que la tâche de la veille n'a pas été terminée le 2 septembre, Je dois mettre à jour is_working le 1er septembre. À ce stade, en supposant que la valeur que vous souhaitez mettre à jour comme le 1er septembre, la valeur que vous souhaitez enregistrer nouvellement comme le 2 septembre, ou dans le cas où il y a plusieurs utilisateurs, le SQL ci-dessus est appelé user_id. La contrainte est définie uniquement lorsque date_id correspond.
Tout ce que vous avez à faire est de transmettre les valeurs html à Controller et Mapper et d'écrire la syntaxe upsert dans Mapper.
Mapper (extrait)
<insert id="upsert">
insert into ${tableName} (
user_id,
date_id,
is_working
)
values (
#{user_id},
#{date_id},
#{is_working}
)
ON CONFLICT (user_id, date_id)
do update set
is_working = #{is_working}
</insert>
Seulement ça.
Lors de l'écriture de la syntaxe dans Mapper, le mot upsert n'existe-t-il pas dans MyBatis? Pour, Vous écrirez insérer ou mettre à jour. De plus, si vous n'écrivez pas correctement le nom du conflit, cela ne fonctionnera pas, alors faites attention à ne pas faire d'erreur.
Il semble y avoir une autre méthode de spécification utilisant ** DONOTHING ** et INDEX.
S'il s'agit d'un DON, ici Pour une autre utilisation détaillée, je pense que le site here est utile.
J'ai vu de nombreuses façons de taper directement SQL, mais il n'y en avait pas beaucoup qui étaient réellement codées. J'ai essayé de le résumer pour référence. Cependant, il peut ne pas être pertinent pour aucune méthode, pas limité à MyBatis, car la syntaxe SQL ne change pas. La description est la même tant que vous pouvez passer les paramètres à Dao.
Je pense qu'il est plus organisé que décrit dans l'instruction if, donc je voudrais l'utiliser activement dans l'environnement PostgreSQL.
Recommended Posts