upsert(conn,tableName,fieldNames,keyFields,data, varargin)
UPSERT inserts new and updates old data to a database table
UPSERT(CONNECT,TABLENAME,FIELDNAMES,KEYFIELDS,DATA).
CONNECT is a database connection object.
TABLENAME is the database table.
FIELDNAMES is a string array of database column names.
KEYFIELDS is the list of primary key fields that must be matched to
perform an UPDATE rather than an INSERT. It may be given as a logical
array the same length as FIELDNAMES, or a string or cell array of
strings of key column names (in which case KEYFIELDS must be a subset
of FIELDNAMES).
DATA is a MATLAB cell array.
INSERTEDMASK = UPSERT(...) returns a logical vector with one element for
each row of DATA, indicating whether the "upsert" operation meant that
corresponding row of DATA was inserted (TRUE) or merely updated (FALSE).
UPSERT(...,'dateFields',DATEFIELDS) allows a DATE type field to be used
as one of the primary key fields. DATEFIELDS is specified equivalently to
KEYFIELDS. Each primary key DATE type field's data MUST be given as an
ANSI string literal (i.e., '1998-12-25'), rather than a MATLAB datenum
number or a differently formatted date string.
(see http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements003.htm#SQLRF51062)
UPSERT(...,'updateFcn',FUNCTION_HANDLE) optionally allows a user to
provide their own function to replace the default MATLAB "update".
UPSERT(...,'debug',true) prints out diagnostic information.
Note: UPSERT runs in two transactions (an insert, then an update) so is not "atomic" thus shouldn't be used in mission-critical applications or multiple-client systems with concurrent and conflicting transactions. Different database flavours implement (or don't) some kind of upsert (MERGE in Oracle, and ... ON CONFLICT in PostgreSQL) but until they agree on a general solution I've found this is a useful MATLAB tool.
Example:
Imagine a database table "PHONE_NOS" with data like:
PERSONID | TYPE | NUMBER
1 'HOME' 1234567
1 'MOB' 1222222
2 'HOME' 9888888
Then the MATLAB commands:
newNos = {1 'MOB' 4444444
2 'MOB' 5555555};
INS = upsert(conn, 'PHONE_NOS', {'PERSONID','TYPE','NUMBER'}, [1 1 0], newNos)
Would result in the table having contents:
PERSONID | TYPE | NUMBER
1 'HOME' 1234567
1 'MOB' 4444444
2 'HOME' 9888888
2 'MOB' 5555555
The returned variable (INS) would be [0; 1], meaning the second row was
updated, the first row was inserted.
Cite As
Sven (2024). upsert(conn,tableName,fieldNames,keyFields,data, varargin) (https://www.mathworks.com/matlabcentral/fileexchange/40080-upsert-conn-tablename-fieldnames-keyfields-data-varargin), MATLAB Central File Exchange. Retrieved .
MATLAB Release Compatibility
Platform Compatibility
Windows macOS LinuxCategories
Tags
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Discover Live Editor
Create scripts with code, output, and formatted text in a single executable document.
Version | Published | Release Notes | |
---|---|---|---|
1.6.0.0 | Fixed a potential issue with very large integers being rounded due to scientific notation. Now uses direct integer matching if integers supplied. |
||
1.5.0.0 | Fixed a bug where the mask [0 1 0] was interpreted numerically rather than [false true false] |
||
1.4.0.0 | Fixed single transpose typo whereby upsert of dates would only work one-at-a-time |
||
1.3.0.0 | Added ability for DATE type fields in primary keys |
||
1.2.0.0 | Another minor fix to the handling of upserting 1000+ rows at a time |
||
1.1.0.0 | Fixed typo where last row on data sets over 1000 rows was skipped. |
||
1.0.0.0 |