如果条目不存在,我如何创建条目,如果存在,我只添加日期?

问题描述

我有一张桌子 TRACKS:

id integer NOT NULL,title text,artist_name text,album_name text,date text,PRIMARY KEY (id),FOREIGN KEY (artist_name) REFERENCES artists(name),FOREIGN KEY (album_name) REFERENCES albums(name)

我想要做的是,如果歌曲的条目存在(相同的艺术家、相同的专辑名称、相同的歌曲名称),则添加条目日期(即 YYYY-MM-DD)。我不在乎时间,只在乎日期。

所以我有这首歌的一个条目,但播放日期不同。我想要重复的日期,因为这样我可以计算播放次数

这是其他表格:

专辑:

id integer NOT NULL,FOREIGN KEY (artist_name) REFERENCES artists(name)

艺术家:

id integer NOT NULL,name text UNIQUE,FOREIGN KEY (artist_name) REFERENCES artists(name)

我可以使用

INSERT OR IGnorE INTO artists(name) VALUES(?)

对于艺人来说,因为名字是唯一的,但其他人我不知道该怎么做,因为不同的艺人可以有相同的专辑名和歌曲名。

样本数据:

我会将“艺术家”、“歌曲”、“专辑”和系统日期以 YYYY-MM-DD 格式提供给数据库

program.py -a "Michael Jackson" -t "Billie Jean" -d "Thriller" 然后程序会自动输入 YYYY-MM-DD。

所以今天我给了应用 -a "Michael Jackson" -t "Billie Jean" -d "Thriller" 3 次。

明天再听两遍。

我希望程序在第一时间创建艺术家、专辑、歌曲和日期,并在 TRACKS 中添加另外两个 2021-06-24,而不复制其他所有内容

明天会增加两次 2021-06-25。

必须以某种方式我可以 COUNT() 日期的数量才能知道我播放了歌曲、专辑或艺术家的次数

解决方法

针对您的要求的标准化架构是有一个单独的表,您每次收听曲目时都会在其中插入一行(带有曲目的 ID 和当前时间戳)。
因此,表 date 中没有 TRACKS 列。

此外,您应该将专辑的 ID 存储在表 TRACKS 中,而不是其标题。
这是常见的做法,也是有原因的:有同名专辑。
此外,不需要存储艺术家,因为您可以从专辑的 id 中获取它。

CREATE TABLE ALBUMS(
  id integer NOT NULL,title text,artist_id integer,PRIMARY KEY (id),FOREIGN KEY (artist_id) REFERENCES artists(id)
);

CREATE TABLE ARTISTS(
  id integer NOT NULL,name text UNIQUE,PRIMARY KEY (id)
); 

CREATE TABLE TRACKS( 
  id integer NOT NULL,album_id text,FOREIGN KEY (album_id) REFERENCES albums(id)
);

CREATE TABLE LISTEN(
  track_id integer NOT NULL,date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (track_id,date),FOREIGN KEY (track_id) REFERENCES tracks(id)
);

您只需提供曲目的 id 即可向表 LISTEN 中插入新行:

INSERT INTO LISTEN(track_id) VALUES (152);

日期默认为当前时间戳。