Bonjour,

J'ai cette requête ( MySQL) que j'aimerai écrire pour postgresql :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
INSERT INTO test7(idTest7,test7Long,test7Int,test7Float,test7CharArray,test7Timestamp,test7Date) 
VALUES (72063769328484353,0,1,0.0,'','1970-01-01 00:00:00.0','1970-01-01'),
       (72063769328484354,0,2,0.0,'','1970-01-01 00:00:00.0','1970-01-01')
ON DUPLICATE KEY UPDATE 
	test7Long=VALUES(test7Long),
	test7Int=VALUES(test7Int),
	test7Float=VALUES(test7Float),
	test7CharArray=VALUES(test7CharArray),
	test7Timestamp=VALUES(test7Timestamp),
	test7Date=VALUES(test7Date)

En cherchant un peu sur le net, j'ai trouvé cette façon de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WITH new_values (idTest7,test7Long,test7Int,test7Float,test7CharArray,test7Timestamp,test7Date) AS (
  VALUES 
    (72063769328484353,0,3,0.0,'',CAST ('1970-01-01 00:00:00.0' AS timestamp),CAST ('1970-01-01' AS DATE)),
    (72063769328484354,0,2,0.0,'',CAST ('1970-01-01 00:00:00.0' AS timestamp),CAST ('1970-01-01' AS DATE)) 
),
upsert AS
( 
    UPDATE test7 
        SET test7Long = new_values.test7Long,
            test7Int = new_values.test7Int,
            test7Float = new_values.test7Float,
            test7CharArray = new_values.test7CharArray,
            test7Timestamp =new_values.test7Timestamp,
            test7Date = new_values.test7Date
    FROM new_values
    WHERE test7.idTest7 = new_values.idTest7
    RETURNING test7.*
)
INSERT INTO test7 (idTest7,test7Long,test7Int,test7Float,test7CharArray,test7Timestamp,test7Date)
SELECT idTest7,test7Long,test7Int,test7Float,test7CharArray,test7Timestamp,test7Date
FROM new_values
WHERE NOT EXISTS (SELECT 1 
                  FROM upsert
                  WHERE upsert.idTest7 = new_values.idTest7)
Est-ce une bonne façon de faire ?
Il y a t'il une meilleure façon de faire ?

Merci de votre aide.