【问题标题】:What kind of additional constraints can I use with PRIMARY KEY?我可以对 PRIMARY KEY 使用什么样的附加约束?
【发布时间】:2021-02-01 01:59:45
【问题描述】:

我希望我的主键允许某些重复条目,我该怎么写? 我希望一首歌可以有多种流派。

CREATE TABLE songs (
    songid INTEGER PRIMARY KEY,
    title TEXT
)

CREATE TABLE genres (
    genreid INTEGER PRIMARY KEY,
    name TEXT


CREATE TABLE has_a_genre (
    songid INTEGER,
    genreid INTEGER,
    FOREIGN KEY (songid) REFERENCES songs (songid),
    FOREIGN KEY (genreid) REFERENCES genres (genreid)
)

这是我正在处理的代码的 sn-p。此代码不采用重复的条目值。 假设我们将这些值输入到数据库中: 流派 (类型,名称) 1、摇滚 2、国家 3、流行 4、电子

Songs
(songid, title)
10001, Tomorrow
10002, Sweet Child O' Mine
10003, Faded

当我输入 has_a_genre 时

(songid, genreid)
10001, 2
10002, 1
10003, 4
10003, 4

这不起作用,因为我当前的代码不允许 10003、4 的多个输入 我如何让它允许这样做?

【问题讨论】:

  • 请提供示例数据以澄清您的问题。
  • MySQL 还是 Postgres?请仅标记一个数据库。
  • 任何有关关系数据库的基本、介绍性手册、书籍或教程都将涵盖这一点。
  • @GMB。这是 Postgres,对不起。我改变了它。可以私信你吗?

标签: sql database postgresql rdbms postgresql-9.1


【解决方案1】:

您描述的是多对多关系。这在使用关系数据库时需要一个额外的表。

CREATE TABLE Songs (song_id INT PRIMARY KEY, ...attributes...);

CREATE TABLE Genres (genre_id INT PRIMARY KEY, ...attributes...);

CREATE TABLE SongGenres (
  song_id INT,
  genre_id INT, 
  PRIMARY KEY (song_id, genre_id),
  FOREIGN KEY (song_id) REFERENCES Songs(song_id),
  FOREIGN KEY (genre_id) REFERENCES Genres(genre_id)
);

您在SongGenres 的每一行放置一对song_id,genre_id。这允许一首歌有多种流派。没有限制,因为您可以为每首歌曲添加任意数量的行。

它还可以轻松查询给定流派的所有歌曲。

【讨论】:

  • 谢谢你。如果我输入 SongGenre 中不存在的genre_id 怎么办。假设 Genres 的genre_id 从 1 到 18,但我在 SongGenres 中输入 19?或者我输入重复的 song_id 和genre_id 例如 (301289, 5) 两次?
  • @QCA:您不能在songgenres 中插入genre_id 中不存在的genre - 外键阻止了这种情况(您需要在genre 中创建父行第一的)。并且:您不能在songgenres 中插入重复的song_id, genre_id)(表的主键中的列元组)。我认为比尔·卡尔文确实回答了你在这里提出的问题。
  • @GMB 我们可以向父表(流派)添加约束以便它处理这个问题吗?
  • 我想通了,没有在我的 SongGenres 表和其他表中添加 PRIMARY KEY (song_id,genre_id)。该死的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多