2016-10-25 4 views
1

私はテーブルを作成するために以下のSQLを持っています。名前の衝突箇所は置き換えられます。コンフリクトをどのように条件に置き換えるか(SQLiteの場合)?

CREATE TABLE IF NOT EXISTS MYTABLE (
    ID INTEGER PRIMARY KEY AUTOINCREMENT, 
    NAME TEXT NOT NULL, 
    DATE INTEGER NOT NULL, 
    CONSTRAINT UNIQUE_NAME UNIQUE (NAME) ON CONFLICT REPLACE 
) 

しかし、私は日付が(数でより大きな)新しい場合のみ、交換、または日付が古い場合、新しい行を無視したいと思います。上記を達成するために私のSQL(SQLiteの場合)文をどのように変更できますか?

+0

年齢が高ければどうなるでしょうか? –

+0

古いバージョンを削除します。常に最新のものを持ってください。これは、さまざまなソースからのデータを同期する場合に使用されます。ここでは、最新のもの(Androidデバイス内)を保存します。 – Elye

+0

編集のための@CLに感謝します! – Elye

答えて

1

それはテーブル制約でこれを行うことはできません、あなたの代わりにtriggersを使用する必要があります。

CREATE INDEX just_some_index ON MyTable(Name); 

CREATE TRIGGER MyTable_Name_insert_newer 
BEFORE INSERT ON MyTable 
FOR EACH ROW 
WHEN (SELECT Date FROM MyTable WHERE Name = NEW.Name) <= NEW.Date 
BEGIN 
    DELETE FROM MyTable 
    WHERE Name = NEW.Name; 
END; 

CREATE TRIGGER MyTable_Name_insert_older 
BEFORE INSERT ON MyTable 
FOR EACH ROW 
WHEN (SELECT Date FROM MyTable WHERE Name = NEW.Name) > NEW.Date 
BEGIN 
    SELECT RAISE(IGNORE); 
END; 

は(SQLiteのでは、結果のないスカラー副問合せはので、新しい行になりを挿入し、単にNULLを返しますどちらのWHEN句も失敗します。)

関連する問題