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

wr98u20j  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(166)

我有两个主表,一个保存products,另一个保存与产品相关的costs。问题是,我需要一个链接表来合并结合两者(lookup表),因为成本只知道代码,而产品只知道类。(这个结构是出于历史数据的原因……)
我需要构造一个外键,以确保每个产品都有价格。
一个简单的MWE将是(目前没有FK)

  1. -- only has class; no code...
  2. CREATE TABLE products (
  3. class TEXT NOT NULL,
  4. color TEXT NOT NULL,
  5. price REAL,
  6. UNIQUE(class)
  7. -- THIS is what I want; but b.c. COMBINED is a view and not a table, I get
  8. -- the error later
  9. -- FOREIGN KEY (class, color) REFERENCES COMBINED (class, color)
  10. );
  11. -- only code no class...
  12. CREATE TABLE costs (
  13. code TEXT NOT NULL,
  14. color TEXT NOT NULL,
  15. cost REAL,
  16. UNIQUE(code, color)
  17. );
  18. -- link table for products and costs
  19. CREATE TABLE lookup (
  20. class TEXT NOT NULL,
  21. code TEXT NOT NULL,
  22. UNIQUE(class)
  23. );
  24. CREATE VIEW COMBINED AS
  25. SELECT costs.code, lookup.class, costs.color
  26. FROM costs LEFT JOIN lookup ON costs.class = lookup.class;

然后,测试数据:

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

当我使用外键作为删除时,我得到错误foreign key mismatch - "products" referencing "COMBINED",因为COMBINED是一个视图而不是一个表。
有没有什么方法可以做到这一点,或者我需要玩弄触发器,以确保成本总是有一个匹配的列?

mfuanj7w

mfuanj7w1#

我还是觉得你把事情弄得太复杂了
锁定表是桥接表

  1. CREATE VIEW COMBINED AS
  2. SELECT costs.code, lookup.class
  3. FROM costs LEFT JOIN lookup ON costs.class = lookup.class;
  1. CREATE TABLE costs (
  2. code TEXT NOT NULL,
  3. cost REAL,
  4. UNIQUE(code)
  5. );

  1. CREATE TABLE products (
  2. class TEXT NOT NULL,
  3. price REAL,
  4. UNIQUE(class)
  5. );

  1. PRAGMA foreign_keys = ON;

  1. CREATE TABLE lookup (
  2. class TEXT NOT NULL,
  3. code TEXT NOT NULL,
  4. UNIQUE(class, code),
  5. FOREIGN KEY (class) REFERENCES products (class),
  6. FOREIGN KEY (code) REFERENCES costs (code)
  7. );

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

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

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

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

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

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

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

fiddle

展开查看全部

相关问题