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

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,如果它不存在,我将如何让机器人创建一个频道,但如果它确实存在,它将继续执行它的任务?

MATLAB。写入文本文件或创建它,如果它不存在。将图形保存在目录中,如果不存在则创建它

SAS:如果存在则更新数据集,否则创建它

C# SQL 创建表如果它不存在[重复]

如果不存在但不更新,如何在猫鼬中创建

如果不存在但不更新,如何在猫鼬中创建