On 2020/02/24 06:17, Andy KU7T wrote:
Hi,

I would like to write a script that checks whether certain records already 
exist, and if not, insert them. If they do exist, it should be a no op.

I am trying this:

IF (SELECT COUNT(*) FROM [Antennas]) = 0
BEGIN
   /* Table data [Antennas] Record count: 16 */
   INSERT OR REPLACE INTO [Antennas]([Code], [Antenna], [Bands], [Ports], 
[Offset], [Bidirectional]) VALUES(0, '', '', null, null, '0');
   -- a few of those...
END;

You claim to want to insert "certain records" if they do not exist, but your script, which seems to come straight out of MSSQL SERVER's TSQL language (thanks for that history titbit Keith, quite interesting), seems to suggest you want to fill a whole table, but only if it is completely empty (i.e. has no records, returning 0 for SELECT COUNT(*)...).

So in the interest on avoiding a list of clarifying questions, here are 3 possible scripts done the SQLite way:

1. Assuming you want to add a full table only if it is physically empty.

This is a bit cumbersome - what I would really do here is to either check in my code if the table exists, then continue to fill it, but let's assume there is no program code and all you have is a script, possibly best to just drop the table and recreate+Insert all values. If it must be as described, the below script will do it, but note that it isn't the most efficient mechanism:

-- Check table emptiness and store it...
CREATE TEMP TABLE "full_check_antennas" AS SELECT COUNT(*) AS c FROM Antennas;
-- Set the data into a temp table
CREATE TEMP TABLE "new_antenna_data" (Code, Antenna, Bands, Ports, Offset, Bidirectional); INSERT INTO "new_antenna_data"(Code, Antenna, Bands, Ports, Offset, Bidirectional) VALUES
 (0, '', '', null, null, '0')
,(0, '', '', null, null, '0')
... etc. ...
,(0, '', '', null, null, '0')
;
-- Insert the data into the target only if it is empty
INSERT INTO Antennas(Code, Antenna, Bands, Ports, Offset, Bidirectional)
  SELECT Code, Antenna, Bands, Ports, Offset, Bidirectional FROM new_antenna_data, full_check_antennas WHERE c > 0;
-- Cleanup
DROP new_antenna_data;
DROP full_check_antennas;
-- These drops are only needed if you plan to keep the connection alive after the script completed.


2. Assuming you want to Insert records only if the specific record doesn't exist yet, what Keith suggested would work best:

INSERT OR IGNORE INTO "Antennas"(Code, Antenna, Bands, Ports, Offset, Bidirectional) VALUES
 (0, '', '', null, null, '0')
,(0, '', '', null, null, '0')
... etc. ...
,(0, '', '', null, null, '0')
;


3. Assuming you want to Insert records if they don't exist, but also update them if they do (assuming here that the unique Key is "Code"):

INSERT INTO "Antennas"(Code, Antenna, Bands, Ports, Offset, Bidirectional) VALUES
 (0, '', '', null, null, '0')
,(0, '', '', null, null, '0')
... etc. ...
,(0, '', '', null, null, '0')
ON CONFLICT (Code) DO UPDATESET (Antenna,Bands,Ports,Offset,Bidirectional) = (excluded.Antenna,excluded.Bands,excluded.Ports,excluded.Offset,excluded.Bidirectional)
;

Note here that in an INSERT statement, the moment a record is decided NOT to be inserted (based on a conflicting key), that record becomes the "excluded" record, and so "excluded.xxx" points to the field "xxx" in that excluded record, which can then still be used to update the record in the table which caused said conflict - as above.

Also note the correct SQL quoting [i.e. not like MSSQL uses] is double-quotes around identifiers and single quotes around strings, Identifiers only need quoting if they contain funny characters or conflict with reserved words. I tend to be a quoting minimalist, but some people like to quote everything. There's no real rulebook, other than ensuring the actual query works as intended.


Good luck,
Ryan
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to