MySQL问题与外键验证

时间:2016-11-18 19:42:42

标签: mysql sql

我目前正在自学自己的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

1 个答案:

答案 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列。