SQL一对多

Chr*_*cha 4 sql database foreign-keys h2

我正在尝试为我们拥有的系统构建一个SQL模式channels,每个系统都有一个id,一个或多个fixtures.我很难找到实现这种一对多映射的方法.(即channel一对多fixtures).我正在使用H2数据库引擎.

我不能有一张桌子:

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

CREATE TABLE channel(
  id INT NOT NULL PRIMARY KEY,
  fixture INT NOT NULL
  );
Run Code Online (Sandbox Code Playgroud)

...... 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
  );
Run Code Online (Sandbox Code Playgroud)

......因为这f_set是必须的UNIQUE

我目前正在实施如下:

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
  );
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*y M 11

"一对多"意味着许多项目(可能)引用一个项目.如果它是许多灯具的一个通道,那么灯具应该引用通道,而不是反过来,这意味着引用列应该在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)
  );
Run Code Online (Sandbox Code Playgroud)

  • @Chris不在H2.你会如何创建一个"频道"?你首先必须创建一个`fixture`.但是你不能先创建一个`fixture`而不先创建一个`channel` ...同样删除条目.某些数据库支持在提交事务时检查的约束,但不支持H2. (2认同)