我从Access转到了MySQL(InnoDB)
前端是Access,后端是MySQL。使用InnoDb代替MyISAM来使用关系函数。
在我最初的Access应用程序中,我有1:1的工作关系。您可以在这里查看
由于此代码仅给了我1:N关系,因此我不得不手动编辑模式模型。 该模型如下所示:this for the relations.(Ivan Cachicatari reply) 在使模型看起来完全像原始的Access关系之后,我将其与Schema进行了同步。
表格说明:
我有一个StockChange(Bestandsaenderung)表。主键BestandsanederungID
当退货(Rückgabe),位置(Positionen)或传入货物(Wareneingang)发生变化时,它也会在StockChange中注册,并且StockExcahnge的主键会自动插入表格(X-BestandsaenderungIdREF)
MYSQL中的代码(我只关注这两个表。当一个表的工作比例为1:1时,希望其他表很容易)
CREATE TABLE `tbl_lager_bestandsaenderungen`
(
`BestandsaenderungID` int(11) NOT NULL AUTO_INCREMENT,
`BestandsaenderungArtikelIDRef` int(11) DEFAULT '0',
`BestandsaenderungAnzahl` int(11) DEFAULT '0',
`BestandsaenderungDatum` datetime DEFAULT NULL,
`BestandsaenderungVorzeichen` int(11) DEFAULT '1',
`BestandsaenderungInventur` tinyint(1) DEFAULT '0',
PRIMARY KEY (`BestandsaenderungID`),
KEY `BestandsaenderungArtikelIDRef` (`BestandsaenderungArtikelIDRef`),
KEY `BestandsaenderungID` (`BestandsaenderungID`),
CONSTRAINT `tbl_Lager_Artikeltbl_Lager_Bestandsaenderungen` FOREIGN KEY (`BestandsaenderungArtikelIDRef`) REFERENCES `tbl_lager_artikel` (`ArtikelID`) )
CREATE TABLE `tbl_lager_wareneingang` (
`WareneingangID` int(11) NOT NULL AUTO_INCREMENT,
`WareneingangLieferantIDRef` int(11) DEFAULT '0',
`Einkaufspreis` decimal(19,4) DEFAULT '0.0000',
`WareneingangBestandsaenderungIDRef` int(11) DEFAULT '0',
PRIMARY KEY (`WareneingangID`),
UNIQUE KEY `WareneingangBestandsaenderungIDRef_UNIQUE` (`WareneingangBestandsaenderungIDRef`),
KEY `WareneingangLieferantIDRef` (`WareneingangLieferantIDRef`),
KEY `WareneingangID` (`WareneingangID`),
KEY `fk_tbl_lager_wareneingang_tbl_lager_bestandsaenderungen1_idx`(`WareneingangBestandsaenderungIDRef`),
CONSTRAINT `fk_tbl_lager_wareneingang_tbl_lager_bestandsaenderungen1` FOREIGN KEY (`WareneingangBestandsaenderungIDRef`) REFERENCES `tbl_lager_bestandsaenderungen` (`BestandsaenderungID`),
CONSTRAINT `tbl_Lager_Firmentbl_Lager_Wareneingang` FOREIGN KEY (`WareneingangLieferantIDRef`) REFERENCES `tbl_lager_firmen` (`LieferantID`)
)
为了检查一切是否还好,我再次通过“逆向工程”创建了一个模型,以查看1:1实境是否仍然存在,但又是1:N关系。
我的问题是,在我的Access表单中,库存更改的PrimaryKey没有插入到收货表ForeignKey WareneingangBestandsaenderungIDRef中。
在纯Access中,它运行完美。迁移后,所有1:1关系都不再起作用。
当我将数据输入子表单(Wareneingang)时,MainForm的PK(Bestandsaenderung)被插入WareneingangBestandsaenderungIDREf。video
另外,如果我尝试提交第二个子记录,我会得到
“ ODBC-调用失败。密钥的条目重复“ 1” 'WareneingangBestandsaenderungIDRef_UNIQUE'(#1062)“
答案 0 :(得分:0)
前言:您会问两个不同的Access对象(表和表单)问题,下面试图回答这些问题。
表关系问题
查看表(不是表格)的屏幕快照,MS Access中使用的表关系图可能仅适用于Jet / ACE(即Access)表,而不适用于链接表。因此,父表和子表之间的相关键的自动功能可能无法有效触发。 Access.exe的GUI可能不了解外部MySQL引擎及其架构编码。 Access可能与Microsoft SQL Server更好地集成在一起,因为它们都是同一供应商的商业产品。
Remember Access”链接表工具是用于任何 ODBC或OLEDB后端的通用API,包括MySQL,PostgreSQL,SQLite,SQL Server,Teradata,Oracle,DB2,甚至是Quickbooks和Salesforce。识别和同步所有这些不同的商业和开源软件的关系完整性和方案可能是不可行的。因此,不要依赖链接表的表视图中的自动同步主键/外键,而是根据需要手动输入。
表单自动父级关键问题
在观看视频时,您的子表单绝不会直接放置在父表单中,因此从技术上讲,它们不是 子表单。取而代之的是,您可以通过单击按钮调用弹出式窗体,并在主窗体上具有子记录的列表框。弹出的子窗体不在父窗体的控件中,因此看不到任何父键。同样,不会基于父表单/子表单关系自动将父键分配给子表。
由于子窗体是按钮单击事件中的弹出式窗体,因此需要一种编码解决方案以将父键映射到涉及MS Access触发事件的子表。在使用Form.Dirty属性或DoCmd.RunCommand操作输入子表单以使用户的更改完成后,考虑保存 new 或现有的父记录。然后,给您的孩子填写表格密钥。
具体来说,将保存和分配操作放置在主表单的按钮OnClick
事件中:
Private Sub OpenPopForm_Click()
DoCmd.OpenForm "ChildPopupForm"
Forms!ParentFormName.Dirty = False ' SAVES CURRENT FORM RECORD
' DoCmd.RunCommand acCmdSaveRecord ' ALSO SAVES CURRENT FORM RECORD
Forms!ChildPopupForm!ForeignId.DefaultValue = Forms!ParentFormName!PrimaryId
' Forms!ChildPopupForm!ForeignId = Forms!ParentFormName!PrimaryId ' DIRECTLY ASSIGN
End Sub
或者,将相同的动作放在弹出式表单的OnOpen
事件中:
Private Sub Form_Open(Cancel As Integer)
Forms!ParentFormName.Dirty = False ' SAVES PARENT FORM ENTRIES
Forms!ChildPopupForm!ForeignId = Forms!ParentFormName!PrimaryId ' DIRECTLY ASSIGN
End Sub
在以上两个代码段中都使用绝对引用,以避免与Me
混淆。如果DefaultValue
属性不存在外部ID控件,请在弹出表单上添加外部ID,并将visible属性设置为False
以向用户隐藏。