【发布时间】:2014-05-14 12:28:46
【问题描述】:
我们有一个通过 ODBC 连接到 MySQL 后端的 MS Access 前端。我们正在尝试将两个具有一对一关系的表移动到后端。然后,我们有一个 Access 查询,将表与 INNER JOIN 组合起来,并将查询显示为表单上的数据表。
当表在 Access 中(未链接)时,您可以在查询数据表视图中添加一行,然后 Access 在两个表中创建具有相同主键的行。当表被移动到 MySQL 后端时,尝试在查询中插入新记录被阻止,状态栏中出现错误:
Cannot add record(s); primary key for table `Child` not in recordset.
以下是简化的表和查询定义:
-- MySQL table definitions:
CREATE TABLE Parent (
ID int(11) NOT NULL AUTO_INCREMENT,
Model varchar(255) DEFAULT NULL,
PRIMARY KEY (ID)
);
CREATE TABLE Child (
ID int(11) NOT NULL DEFAULT '0',
ModelNum int(11) DEFAULT NULL,
PRIMARY KEY (ID),
CONSTRAINT fk_Child_Parent FOREIGN KEY (ID) REFERENCES Parent (ID)
);
-- MS Access Query:
SELECT Parent.ID, Parent.Model, Child.ModleNum
FROM Parent INNER JOIN Child ON Parent.ID = Child.ID;
如果您只为父表(即模型)输入数据,Access 将允许您在查询中添加一行。这当然只会在 Parent 表中创建一行。当您尝试在 ModelNum 字段中键入任何内容时,Access 会阻止它并在状态栏中显示上述错误消息。
我尝试在“访问关系”窗口中创建关系。我在两个表中都添加了 TIMESTAMP 列。我还使用wireshark 来嗅探MySQL 连接; Access 在显示错误时似乎没有发送任何内容。
是否可以让 Access 做正确的事情?它应该发送一个INSERT INTO Parent,获取ID,然后使用该密钥获取INSERT INTO Child。我可以添加一个按钮并在 VBA 中执行此操作,但在我们的实际应用程序中,有许多相关的表格和必须复制功能的地方。我们可以使用触发器来创建子行,但这并不适用于实际应用程序中的所有情况。
我们使用的是 MS Access 2007 和 MariaDB 5.5.37。谢谢!
【问题讨论】: