我创建了两个表
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'正在创建。
为什么会出现此错误? 谢谢
答案 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.