我目前正在自学自己的mySQL,并且在将新行插入我的销售数据库时遇到了一个问题。
每次销售产品时,都会在销售数据库中添加一个新行,其中包括买方的ID(来自用户表的外键)和买方的名称(来自用户表的外键) 。
但是我的问题如下。如果我为具有Private Sub this()
Dim xl As Object, wb as Object
Const MODULE_NAME As String = "Module3" '### MODIFY AS NEEDED!
Const PROC_NAME As String = "macro_name" '### MODIFY AS NEEDED!
Dim xlMacro As String
Set xl = CreateObject("Excel.Application")
xl.Visible = True
Set wb = xl.Workbooks.Open("pathToFile" & "\" & "Dig IT.xlsm", True, False)
' builds the string to send to Excel.Run method:
xlMacro = wb.Name & "!" & MODULE_NAME & "." & PROC_NAME
' call the macro in Excel
xl.Run xlMacro
Set xl = Nothing
End Sub
且错误输入id=10
而非name='Peter Smith'
的用户在销售表中插入新记录,即使name='Roger Smith'
不是名称,也会成功用户表中'Peter Smith'
的人。
有人能指出我出错的方向吗?非常感谢。
id=10
答案 0 :(得分:3)
你出错的地方是更新异常,因为实施违反了第三范式(3NF)。
每个属性都取决于密钥,整个密钥以及密钥。所以帮助我Codd。
在您的模型中,user_name
表中的sales
取决于sales
表的键。听起来您希望它依赖于userid
列。
简单的解决方法是从user_name
表中删除 sales
列。当您需要返回user_name时,请根据user_id在users
表中进行查找。例如,对users
表的JOIN操作。
SELECT u.name AS user_name
, s.userid
, s.productprice
, ...
FROM sales s
JOIN users u
ON u.id = s.userid
通过这种方法,我们避免了存储冗余信息。 name
表中的id
列上的users
属性仅依赖于 。
如果强烈需要在user_name
表上存储sales
,那么应用程序逻辑将需要强制执行user_name
{ {1}}表必须与sales
表中相应行中的name
列相同。没有声明性约束会强制执行这种规则
(外键约束仅强制执行该值必须出现在引用表中某些行中的规则。)
可以添加BEFORE INSERT和BEFORE UPDATE触发器来强制执行规则,并执行查找并自动填充users
列。