SQL 一对多

标签 sql database foreign-keys h2

我正在尝试为我们有 channel 的系统构建一个SQL模式,每个 channel 都有一个id,以及一个或多个fixture .我很难找到一种方法来实现这种一对多映射。 (即一个 channel 到许多 fixtures)。我正在使用 H2 database engine .

我没有 table :

 id | fixture
----|----------
  1 |    1
  1 |    2
  2 |    3

CREATE TABLE channel(
  id INT NOT NULL PRIMARY KEY,
  fixture INT NOT NULL
  );

...作为PRIMARY KEY id 必须是UNIQUE

同样,我不能映射如下:

CREATE TABLE channel(
  id INT NOT NULL PRIMARY KEY,
  f_set INT NOT NULL REFERENCES fixtures(f_set)
  );

CREATE TABLE fixtures(
  id INT NOT NULL PRIMARY KEY,
  f_set INT NOT NULL
  );

... 因为这需要 f_setUNIQUE

我目前的实现方式如下:

CREATE TABLE channel(
  id INT NOT NULL PRIMARY KEY,
  f_set INT NOT NULL REFERENCES fixture_set(id)
  );

CREATE TABLE fixtures(
  id INT NOT NULL PRIMARY KEY,
  f_set INT NOT NULL REFERENCES fixture_set(id)
  );

CREATE TABLE fixture_set(
  id INT NOT NULL PRIMARY KEY
  );

...但这意味着我们可以有一个带有fixture_setchannel,它没有分配任何fixtures(不理想) .

我想知道您是否对我如何处理这个问题有任何建议(或者我的理解有误)。谢谢

最佳答案

“一对多”意味着许多项目(可能)引用一个项目。如果它是多个灯具的一个 channel ,那么灯具应该引用 channel ,而不是相反,这意味着引用列应该在 fixtures 表中:

CREATE TABLE channel(
  id INT NOT NULL PRIMARY KEY
  );

CREATE TABLE fixtures(
  id INT NOT NULL PRIMARY KEY,
  channel_id INT NOT NULL FOREIGN KEY REFERENCES channel (id)
  );

关于SQL 一对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677191/

相关文章:

sql - 从表中删除所有数据的最佳方法是什么?

java - 具有不同列数的 Hibernate 多对一映射

python - sqlalchemy 中的多态自引用外键

mysql - 如何在phpmyadmin中使用 "central columns"?

sql - 如果加入返回 NULL 则执行以下操作

java - Redis与数据库通信

c# - 检查之前,还是管理异常?

java - 尝试将数据从 Activity 发送到类时出现空指针异常

php - 如何存储日期/出勤?

android - SQLite 外键约束失败(代码 787)