连接/组合/链接数据集的外键

问题描述 投票:0回答:1

我有两张主表,一张保存

products
,一张保存与产品相关的
costs
。问题是我需要一个链接表来组合两者(
lookup
表),因为成本只知道代码,而产品只知道类。 (此构造是出于历史数据原因......)

我需要构建一个外键来确保每种产品都有价格。

一个简单的 MWE 是(暂时没有 FK)

-- only has class; no code...
CREATE TABLE products (
  class TEXT NOT NULL,
  color TEXT NOT NULL,
  price REAL,
  UNIQUE(class)
  -- THIS is what I want; but b.c. COMBINED is a view and not a table, I get
  -- the error later
  -- FOREIGN KEY (class, color) REFERENCES COMBINED (class, color)
);
 
-- only code no class...
CREATE TABLE costs (
  code TEXT NOT NULL,
  color TEXT NOT NULL,
  cost REAL,
  UNIQUE(code, color)
);

-- link table for products and costs
CREATE TABLE lookup (
  class TEXT NOT NULL,
  code TEXT NOT NULL,
  UNIQUE(class)
);

CREATE VIEW COMBINED AS
  SELECT costs.code, lookup.class, costs.color
  FROM costs LEFT JOIN lookup ON costs.class = lookup.class;

然后,测试数据:

INSERT INTO lookup (class, code) VALUES ('AAA', 'aaa'), ('BBB', 'bbb');
INSERT INTO costs (code, color, cost) VALUES ('aaa', 'red', 123), ('bbb', 'blue', 456);
INSERT INTO products (class, color, price) VALUES ('AAA', 'red', 0.123); -- should work
INSERT INTO products (class, color, price) VALUES ('CCC', 'red', 0.456); -- expect FK error on CCC

当我使用注释掉的外键时,我收到错误

foreign key mismatch - "products" referencing "COMBINED"
,因为 COMBINED 是视图而不是表。

有什么方法可以实现此目的,还是我需要使用触发器来确保成本始终具有匹配的列?

sql sqlite foreign-keys
1个回答
0
投票

我还是觉得你弄得太复杂了

锁台是桥台

CREATE VIEW COMBINED AS
  SELECT costs.code, lookup.class 
  FROM costs LEFT JOIN lookup ON costs.class = lookup.class;
  

CREATE TABLE costs (
  code TEXT NOT NULL,
  cost REAL,
  UNIQUE(code)
);

CREATE TABLE products (
  class TEXT NOT NULL,
  price REAL,
  UNIQUE(class)
);

 PRAGMA foreign_keys = ON;


CREATE TABLE lookup (
  class TEXT NOT NULL,
  code TEXT NOT NULL,
  UNIQUE(class, code),

 FOREIGN KEY (class) REFERENCES products (class),

 FOREIGN KEY (code) REFERENCES costs (code)
);

INSERT INTO costs (code, cost) VALUES ('aaa', 123), ('bbb', 456);

INSERT INTO products (class, price) VALUES ('AAA', 0.123); -- should work

INSERT INTO products (class, price) VALUES ('BBB', 0.346); -- should work

INSERT INTO products (class, price) VALUES ('CCC', 0.456); -- expect FK error on CCC

INSERT INTO lookup (class, code) VALUES ('AAA', 'aaa');

INSERT INTO lookup (class, code) VALUES  ('BBB', 'bbb');

INSERT INTO lookup (class, code) VALUES  ('DDD','ddd');
{
  "code": "SQLITE_CONSTRAINT_FOREIGNKEY"
}

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.