Tìm kiếm trang web

typescript - Trong Drizzle, làm thế nào để chèn vào một bảng MySQL từ một bảng khác và cập nhật nếu đã tồn tại?


Tôi muốn sử dụng Drizzle để chèn vào một bảng, nhưng nếu khóa đã tồn tại, thì cập nhật bảng.

Trong MySQL, tôi có thể viết như sau:

INSERT INTO myTable1(field1,field2,field3,field4)
SELECT fieldOne,fieldTwo,fieldThree,fieldFour
FROM myTable2
  ON DUPLICATE KEY UPDATE 
    field3 = VALUES(field3),
    field4 = VALUES(field4);

Tôi nghĩ tôi có thể sử dụng những điều sau trong Drizzle-ORM:

const insertUpdateTable = async (
    db: DBType,
    sourceTable: number, 
    targetTable: number,
) => {
    const sourceRecords = db.select({
        fieldOne: myTable2.fieldOne,
        fieldTwo: myTable2.fieldTwo,
        fieldThree: myTable2.fieldThree,
        fieldFour: myTable2.fieldFour
    })
    .from(myTable2);

    return await db.insert(myTable1)
        .values(sourceRecords)
        .onDuplicateKeyUpdate({
           set: {
                 field1: sourceRecords.fieldOne,
                 field2: sourceRecords.fieldTwo
           }
        })
}

Cho đến nay, WebStorm cho biết rằng các giá trị của tôi (sourceRecords) và các trường onDuplicateKeyUpdate không hợp lệ. Tôi đang cố gắng duy trì an toàn về kiểu bằng cách sử dụng Drizzle và không sử dụng toán tử Magic SQL. Bạn nghĩ sao?

Câu trả lời #1

Cuối cùng, giải pháp đã tự xuất hiện.

return await db.insert(myTable1)
    .values(sourceRecords)
    .onDuplicateKeyUpdate({
       set: {
             field1: sql`VALUES(field1)`,
             field2: sql`field2`
       }
    })

Đối với trường 1, tôi đang chấp nhận các GIÁ TRỊ đến, trong khi trường 2, tôi đang giữ giá trị ban đầu trong bảng đích.

Có một mức độ rủi ro vì SQL ma thuật không thực thi an toàn kiểu dữ liệu theo cách tôi muốn.

Bài viết liên quan