无法通过 Workbench 或 MS Access 更新 MySQL 视图中的数据

Posted

技术标签:

【中文标题】无法通过 Workbench 或 MS Access 更新 MySQL 视图中的数据【英文标题】:Cannot update data in a MySQL View via Workbench or MS Access 【发布时间】:2014-02-02 18:26:42 【问题描述】:

我使用工作台创建了一个 mysql Schema db1002。它有一个表:id (key, AI) 和 Name (char45)。以及以下观点:

CREATE ALGORITHM = MERGE DEFINER = `xxxx`@`%` SQL SECURITY DEFINER VIEW `new_view` AS
    select `candidates`.`id` AS `id`, `candidates`.`name` AS `name`
    from  `candidates`

根据 mysql 文档,这个视图应该是可更新的。这意味着,在工作台中我查询视图(从 db1002.new_view 中选择 *)。 它显示 1 条记录 = 所有记录。 但是,我无法更新或插入任何记录。通常我可以单击结果列表中的一个字段并更改它。我不能。新的记录行(带 *)也丢失了。 如果我使用 MSACCESS 通过 ODBC 连接到它,我也不会更新表。 在 information_schema 中列出了视图 is_updatable = yes。

顺便说一句,我可以毫无问题地更新基础表候选者。

这里有什么问题?

感谢所有帮助我的人。

更新:我测试了其他东西:如果我在视图上使用“更新new_view set name is pete”,它可以工作。但是,如果我使用工作台,我无法通过直接输入记录来更新。例如。如果如果使用“select * from Candidates”(即表格),那么我可以通过直接在结果列表中输入来更新,我也可以添加一条新记录。通过“select * from new_view”尝试相同的操作,但我不能。 另外,我使用 MS Access 作为前端。如果我访问候选表,我可以更新和添加记录。如果我改为访问 new_view,则不能。 所以基本上,视图是可更新的,但只能通过更新命令而不是通过通常的方法。这在 MS Access 中是一个大问题。

【问题讨论】:

我的猜测是指定的用户没有表的更新权限。 用户可以更新表格 不相关但:你肯定想要char(45)。该数据类型总是用空格填充到定义的长度。我很确定您希望 varchar(45) 用于名为 name 的列 【参考方案1】:

我能够重新创建您的设置,但不是您的问题。只需在数据表视图中打开链接表并输入新记录 (*) 行,我就可以在 Access 中的链接表 [new_view] 中插入一个新行。

复制步骤:创建 MySQL 数据库、表和视图:

-- phpMyAdmin SQL Dump
-- version 4.0.4.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 03, 2014 at 10:08 AM
-- Server version: 5.6.13
-- PHP Version: 5.4.17

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `db1002`
--
CREATE DATABASE IF NOT EXISTS `db1002` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `db1002`;

-- --------------------------------------------------------

--
-- Table structure for table `candidates`
--

CREATE TABLE IF NOT EXISTS `candidates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--
-- Dumping data for table `candidates`
--

INSERT INTO `candidates` (`id`, `name`) VALUES
(1, 'Gord');

-- --------------------------------------------------------

--
-- Stand-in structure for view `new_view`
--
CREATE TABLE IF NOT EXISTS `new_view` (
`id` int(11)
,`name` char(45)
);
-- --------------------------------------------------------

--
-- Structure for view `new_view`
--
DROP TABLE IF EXISTS `new_view`;

CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `new_view` AS select `candidates`.`id` AS `id`,`candidates`.`name` AS `name` from `candidates`;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

创建 ODBC 系统 DSN

要在 Access 中创建链接表,注意为链接表选择“唯一记录标识符”(即主键)的对话框——这很重要:

在 Access 中测试链接表

【讨论】:

戈德,你是英雄!!!!问题在于链接 msaccess 中的表并在该过程中选择主键。我总是认为它已经在服务器上定义了。但是,要更新视图,必须定义主键。有趣的是,工作台也有同样的问题。但这现在不那么重要了。 @user3263493 很高兴听到您成功了。在创建连接到视图的链接表时,这是一个相当常见的绊脚石。 Access 将在链接到 Table 时识别现有主键,但需要告诉它在链接到 View 时使用哪些字段。 @user3263493 p.s.您可能需要考虑accepting这个答案,以表明您的问题已得到解决。 这是 MS Access 的正确答案,但您在哪里为 MySQL Workbench 中的可更新视图指定“主键”?【参考方案2】:
CREATE OR REPLACE ALGORITHM = MERGE VIEW `new_view`

(`id`, `Name`)

AS

 select `candidates`.`id` AS `id`, `candidates`.`name` AS `name`
    from  `candidates

【讨论】:

您好,感谢您的回答。我试过了,结果一样。

以上是关于无法通过 Workbench 或 MS Access 更新 MySQL 视图中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Workbench 将 MS Access 迁移到 MySQL 时出现日期时间错误

使用 Workbench 迁移向导通过 ssh 将 MS SQL Server 数据库迁移到 MySQL

MySQL Workbench 连接到 MS Access

无法从 SQL WORKBENCH 连接到 AWS RDS mysql

无法通过 Workbench 连接到 RDS MySQL 数据库

在mysql workbench中,通过查询语句,为啥无法修改表中的数据?需要改啥设置吗?