Цель
Я хочу получить базу данных sqlite3, в которой нет дублирующихся строк без первичного ключа. Я хочу иметь возможность запускать свой сценарий несколько раз, но при этом не импортировать одни и те же данные в мою базу данных, если она уже существует.
Проблема
Текущая настройка базы данных будет импортировать данные даже если эти же данные уже присутствуют в базе данных (из более раннего импорта).
Пример данных - file.tsv
client1 account1 platform1 2020-04-05 44 advertiser1 5272
client1 account1 platform1 2020-04-06 44 advertiser1 10251
client1 account1 platform1 2020-04-07 44 advertiser1 14176
client2 account1 platform2 2020-04-05 44 advertiser1 5272
client2 account1 platform2 2020-04-06 44 advertiser1 10251
client2 account1 platform2 2020-04-07 44 advertiser1 14176
Код
sqlite3 -batch database.db <<EOF
CREATE TABLE IF NOT EXISTS clientdata_advertiser(
Client TEXT,
Account TEXT,
Platform TEXT,
Date_Delivered DATE,
Advertiser_ID INTEGER,
Advertiser TEXT,
Impressions INTEGER
);
CREATE TEMPORARY TABLE wand(
Client TEXT,
Account TEXT,
Platform TEXT,
Date_Delivered DATE,
Advertiser_ID INTEGER,
Advertiser TEXT,
Impressions INTEGER
);
.mode tabs
.separator \t
.import file.tsv wand
INSERT INTO clientdata_advertiser (Client, Account, Platform, Date_Delivered, Advertiser_ID, Advertiser, Impressions)
SELECT
CAST (Client AS TEXT),
CAST (Account AS TEXT),
CAST (Platform AS TEXT),
strftime('%Y-%m-%d',Date_Delivered),
CAST (Advertiser_ID AS Integer),
CAST (Advertiser AS TEXT),
CAST (Impressions AS Integer)
FROM wand;
EOF
Текущий вывод код запускается 2x
sqlite> .headers on
sqlite> select * from clientdata_advertiser ;
Client|Account|Platform|Date_Delivered|Advertiser_ID|Advertiser|Impressions
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176
Требуемый вывод, если код запускается 2x
sqlite> .headers on
sqlite> select * from clientdata_advertiser ;
Client|Account|Platform|Date_Delivered|Advertiser_ID|Advertiser|Impressions
client1|account1|platform1|2020-04-05|44|advertiser1|5272
client1|account1|platform1|2020-04-06|44|advertiser1|10251
client1|account1|platform1|2020-04-07|44|advertiser1|14176
client2|account1|platform2|2020-04-05|44|advertiser1|5272
client2|account1|platform2|2020-04-06|44|advertiser1|10251
client2|account1|platform2|2020-04-07|44|advertiser1|14176
То, что я пробовал
Я пробовал различные способы, возможно, делать это когда данные находятся в таблицах, но, похоже, не смогли заставить их работать. Я подозреваю, что лучший способ - убедиться, что строки не будут импортированы в таблицу, если они уже есть, но я не смог выяснить в Интернете, как я мог бы сделать это, не имея первичного ключа - который мой набор данных не содержит. Буду признателен за любые отзывы или предложения.