SQLiteソリューション(同じ原則がmysqlにも適用されます)
単純にUNIQUEインデックスを追加して(少なくともこれが対象となるSQLiteの場合)、次のようにすることができます:-
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER, //<<<<<<<<<< See notes below
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL,
PRIMARY KEY ( `id` )
);
CREATE UNIQUE INDEX IF NOT EXISTS uuid_date ON `users` (`uuid`,`date`); //<<<<<<<<<<
-
AUTO_INCREMENT
に注意してください SQLiteはキーワードではないため、失敗します。SQliteの正しいキーワードはAUTOINCREMENT
です。 。ただし、INTEGER PRIMARY KEY(またはPRIMARY KEY (id)
を指定することによる暗黙的)としてはおそらく必要ないため、省略されています。 )挿入時に列に値が指定されていない場合、一意のIDが自動的に生成されます。 -
SQLiteでは、自動生成されたIDにINTではなくINTEGERが必要です。 NOT NULLおよびUNIQUEも暗黙指定されているため、指定する必要はありません。
これは、それぞれがuuid / dateの組み合わせを複製する2セットの挿入例です。したがって、挿入する代わりに更新し、同じuuidで挿入しますが、日付が異なります。その逆も同様です:-
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 1st','20180101');
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','20180101'); -- <<<< DUPLICATE
INSERT OR REPLACE INTO `users` VALUES(null,'Fred99999999','Fred Bloggs the 2nd','20180101'); -- <<<< different uuid same date
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','99999999'); -- <<<< same uuid different date
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred99999999','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','99999999');
SELECT * FROM `users`;
結果は:-