首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过mysql中的函数通过视图创建表

问无法通过mysql中的函数通过视图创建表
EN

Stack Overflow用户
提问于 2016-01-27 09:53:56
回答 1查看 953关注 0票数 3

我创建了两个表

代码语言:javascript
复制
CREATE TABLE `prova` (
`id`  int NOT NULL AUTO_INCREMENT ,
`text`  varchar(255) NOT NULL ,
PRIMARY KEY (`id`)
)
;

CREATE TABLE `prova2` (
`id2`  int NOT NULL AUTO_INCREMENT ,
`text2`  varchar(255) NOT NULL ,
PRIMARY KEY (`id2`)
)
;

insert into prova (text) values ('ffffff');

只有当变量@test的值设置为0时,函数才会对表1进行选择,并在表2中插入一行:

代码语言:javascript
复制
CREATE FUNCTION `get_prova`()
 RETURNS int(11)
BEGIN

declare id_prova int ;
declare test int ;


    set @test = 1;
    set @id_prova = (select id from prova limit 1);

    if (@test = 0) THEN
        insert into prova2 (text2) values ('dddd');
    end if;

return @id_prova;

END;

然后,创建一个调用此函数的视图:

代码语言:javascript
复制
create view temp_prova as 
select  id,
            text, 
            get_prova() as prova
from prova

我想要创建包含视图结果的表3:

代码语言:javascript
复制
CREATE TABLE zzz_prova  SELECT * FROM temp_prova;

但是,当我试图创建表zzz_prova时,我会得到以下错误:

SQLCREATE表zzz_prova SELECT *从temp_prova;Err 1746 -在创建'zzz_prova‘时不能更新表'prova2’。

为什么会出现这个错误?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-27 14:03:41

您运行的是什么版本的MySQL?

MySQL 5.6.2 (2011-04-11)的变化

  • 不兼容的更改;复制:不再可能发出创建表.SELECT语句,该语句更改正在创建的表以外的任何表。任何这样的语句都不会被执行,而是在出错时失败。 此更改的一个结果是,在CREATE的SELECT部分可能不再使用One。选择。 这意味着,在从上一个版本升级之前,应该重写任何CREATE表.选择会导致其他表中更改的语句,以便这些语句不再这样做。 此更改还会影响MySQL 5.6 (或更高版本的从服务器)与运行以前版本的MySQL的主服务器之间基于语句的复制。在这种情况下,如果一个创建表..。导致其他表更改的主表上的SELECT语句在主表上成功,但是该语句在从服务器上失败,导致复制停止。为了防止这种情况发生,您应该使用基于行的复制,或者在主服务器上运行之前重写违规语句。(Bug #11749792,Bug #11745361,Bug #39804,Bug #55876) 参考资料:参见Bug #47899。

更新

MySQL 5.5

代码语言:javascript
复制
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.5.47    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP FUNCTION IF EXISTS `f`;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `t1`;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `t2`;
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER |

mysql> CREATE FUNCTION `f`()
    -> RETURNS INT
    -> BEGIN
    ->     INSERT INTO `t2` VALUES (1);
    ->     RETURN 1;
    -> END|
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> CREATE TABLE `t2`(`c1` INT);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `t1` SELECT `f`() `c1`;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT `c1` FROM `t1`;
+------+
| c1   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> SELECT `c1` FROM `t2`;
+------+
| c1   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

MySQL 5.6

代码语言:javascript
复制
mysql> SELECT VERSION();
+-----------------+
| VERSION()       |
+-----------------+
| 5.6.25          |
+-----------------+
1 row in set (0.00 sec)

mysql> DROP FUNCTION IF EXISTS `f`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP TABLE IF EXISTS `t1`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DROP TABLE IF EXISTS `t2`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> DELIMITER |

mysql> CREATE FUNCTION `f`()
    -> RETURNS INT
    -> BEGIN
    ->     INSERT INTO `t2` VALUES (1);
    ->     RETURN 1;
    -> END|
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> CREATE TABLE `t2`(`c1` INT);
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `t1` SELECT `f`() `c1`;
ERROR 1746 (HY000): Can't update table 't2' while 't1' is being created.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35033959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档