无法通过 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
无法从 SQL WORKBENCH 连接到 AWS RDS mysql