【发布时间】:2023-01-30 10:55:16
【问题描述】:
使用触发器(更新和插入)来防止将两个不兼容的组件插入到同一装配体中,而不管它们的添加顺序如何。
我有一个包含 OrderID 和 ProductID 列的表 Order,以及另一个包含 3 列 nvarchar 类型的表 Compactibility 以检查可压缩性。
如何触发以比较具有相同 OrderID 的产品并检查字符串 (编辑:这不是完整的数据库,只是重要的数据)
CREATE TABLE Compactibility(
IDProduct int NOT NULL FOREIGN KEY REFERENCES
Produto(IDProduto),
Caixa nvarchar(50) NOT NULL CHECK (Caixa IN ('ATX', 'Micro-ATX', 'ALL')),
Socket nvarchar(50) NOT NULL CHECK (Socket IN ('LGA2066','LGA1700', 'A76M', 'NONE')),
TipoRAM nvarchar(7) NOT NULL CHECK (TipoRAM IN ('NONE','DDR4','DDR5')),
)
GO
CREATE TABLE Order(
IDOrder int NOT NULL PRIMARY KEY identity(1,1),
IDProduct int FOREIGN KEY REFERENCES Product(IDProduct)
)
GO
【问题讨论】:
-
我建议您应该使用表来处理 Sockets、RamType、CaseType 等内容。然后你会为这个表创建外键。考虑一下一旦发布了一种新型 RAM,这种设计将是多么痛苦。如果你已经正确规范化了所有你需要做的就是在 RamType 表中添加一行,一切都会正常工作。
-
你能触发 Compactibility 的插入吗?在触发器代码中,检查产品 ID 是否也出现在订单表中的任何订单中。
-
我为每个组件都有一个表,但我没有时间,这是我的第一个 sql 项目,所以我做的有点简单
-
使用触发器来强制执行参照完整性是一个非常明显的标志,表明某些地方在设计中走错了方向。触发器可能有用,但不能确保数据正确。这就是约束的作用。
-
“检查字符串”不够清楚。以什么方式检查它们?
标签: sql sql-server database