如果它不存在,我如何创建一个条目,如果它存在我只添加日期?
Posted
技术标签:
【中文标题】如果它不存在,我如何创建一个条目,如果它存在我只添加日期?【英文标题】:How do i create an entry if it not exists and if it exists i just add the date? 【发布时间】:2021-09-08 03:11:31 【问题描述】:我有一张桌子跟踪:
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,
title text,
artist_name text,
PRIMARY KEY (id),
FOREIGN KEY (artist_name) REFERENCES artists(name)
艺术家:
id integer NOT NULL,
name text UNIQUE,
PRIMARY KEY (id),
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” 三遍。
明天再听两遍。
我希望程序在第一时间创建艺术家、专辑、歌曲和日期,并在 TRACKS 中再添加两个 2021-06-24,而不重复其他所有内容。
明天它会增加两次 2021-06-25。
它必须以某种方式让我可以 COUNT() 日期的数量,以了解我播放歌曲、专辑或艺术家的次数。
【问题讨论】:
sqlitetutorial.net/sqlite-replace-statement 发布样本数据和预期结果以阐明您想要什么。 @CaiusJard 不会替换只是覆盖日期吗? 这就是我解释你的意思,如果歌曲的条目存在......添加条目日期。如果您的意思是“DATE 应该是歌曲曾经播放过的所有日期的 CSV,并且每个插入的欺骗都应该扩展 CSV”,那么出于对良好工程的热爱,请不要这样做。放另一个表来跟踪在什么日期播放的歌曲 ID。对于将本机 1:many 关系的“多”端存储在表中的单个列中的想法,我无法反驳。这是一个糟糕的主意 @CaiusJard DATE 将复合。每次我播放一首歌时,它都会在 DATE 中添加另一个条目。所以我应该为此创建一个单独的表?这应该如何工作?每次新播放它都会记录 DATE 和 SONG_ID? 【参考方案1】:满足您要求的规范化架构是有一个单独的表,您每次收听曲目时都会在其中插入一行(带有曲目的 id 和当前时间戳)。
因此,TRACKS
表中没有 date
列。
此外,您应该将专辑的 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,
title text,
album_id text,
PRIMARY KEY (id),
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);
日期默认为当前时间戳。
【讨论】:
所以,TRACKS 表中没有日期列。 - 实际上,tracks 表中的任何日期都应该是与曲目本身相关的日期,例如录制日期,它的许可证到期的日期,无论如何......当然它的名称会比“日期”更好(从不命名列类型),例如“RecordingDate”或“LicensedUntil” @CaiusJard 您指的是用于其他目的的列,在这种情况下,它可能类似于date_created
。
@forpas 是的。我完全同意你的看法。我的评论更针对 OP,真的..
@crdpa when
是一个 SQL 关键字(case when...)。避免使用保留字命名列。列名的字符并没有真正的定量 - 努力使它们变得更好和描述性; “当”有点不伦不类
@crdpa 这是您可以使用的架构的简化版本。在更高级的架构中,您将不得不考虑包含超过 1 个艺术家的专辑以及可能属于超过 1 个专辑甚至更多专辑的曲目。以上是关于如果它不存在,我如何创建一个条目,如果它存在我只添加日期?的主要内容,如果未能解决你的问题,请参考以下文章
Discord.py,如果它不存在,我将如何让机器人创建一个频道,但如果它确实存在,它将继续执行它的任务?