无法通过mysql中的函数创建表

时间:2016-01-27 09:53:56

标签: mysql select view insert

我创建了两个表

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中插入一行:

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;

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

create view temp_prova as 
select  id,
            text, 
            get_prova() as prova
from prova

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

CREATE TABLE zzz_prova  SELECT * FROM temp_prova;

但是当我尝试创建表zzz_prova时,我收到此错误:

  

[SQL] CREATE TABLE zzz_prova SELECT * FROM temp_prova; [错] 1746 -   无法更新表格' prova2'而' zzz_prova'正在创建。

为什么会出现此错误? 谢谢

1 个答案:

答案 0 :(得分:2)

您运行的是哪个版本的MySQL?

  

Changes in MySQL 5.6.2 (2011-04-11)

     
      
  • 不相容的变化;复制:不再可能发布   CREATE TABLE ... SELECT语句,用于更改除。之外的任何表   正在创建的表。任何此类陈述均未执行   而是因错误而失败。

         

    此更改的一个后果是FOR FORDDATE可能不再是   与CREATE TABLE ... SELECT的SELECT部分​​一起使用。

         

    这意味着,在从先前版本升级之前,您   应该重写任何导致的CREATE TABLE ... SELECT语句   其他表中的更改,以便语句不再这样做。

         

    此更改还会对基于语句的复制产生影响   MySQL 5.6(或更高版本的从属)与运行前一个的主服务器之间的连接   MySQL的版本。在这种情况下,如果是CREATE TABLE ... SELECT   主服务器上导致其他表更改成功的语句   在主人身上,声明仍然在奴隶身上失败,造成了   复制停止。为了防止这种情况发生,你应该这样做   使用基于行的复制,或者之前重写有问题的语句   在主人身上运行它。 (Bug#11749792,Bug#11745361,Bug#39804,   错误#55876)

         

    参考文献:另见Bug#47899。

  •   

<强>更新

MySQL 5.5

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

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.