问题描述
我在 MariaDB 中创建了两个表,其中一个有一个用于计算外键的列。脚本的简化版本遵循以下格式:
CREATE TABLE a {
pk INT PRIMARY KEY,value INT
}
CREATE TABLE b {
pk INT PRIMARY KEY,value INT,calc INT,CONSTRAINT fk
FOREIGN KEY (value)
REFERENCES a (value)
}
事实证明'calc'总是等于'value'+1。查询 'b' 时,从不引用 b.value,但经常引用 b.calc。 我应该删除“calc”以保持第三范式,还是有办法删除 b.calc 对 b.value 的依赖?类似的东西:
CREATE TABLE b {
pk INT PRIMARY KEY,CONSTRAINT fk
FOREIGN KEY (calc)
REFERENCES a (value+1)
}
感谢您的帮助。
解决方法
外键必须具有引用列的实际值。
您可以使用虚拟(AKA 生成)列来创建计算列。
CREATE TABLE b (
pk INT PRIMARY KEY,value INT,calc GENERATED ALWAYS AS value + 1,FOREIGN KEY (value) REFERENCES a (value)
);