我在我的程序中创建了一个临时表,但我总是得到一个错误"表已经存在".
然后我尝试创建一个随机名称以避免冲突,但我不知道如何执行SQL字符串
SET @tbName = CONCAT('temp', random_id);
PREPARE stmt1 FROM 'CREATE TEMPORARY TABLE ? (`FIELDNAME` float NOT NULL);';
EXECUTE stmt1 using @tbName;
DEALLOCATE PREPARE stmt1;
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用.为什么?怎么纠正呢?
我有一个创建临时表的客户端应用程序,在临时表中执行批量插入,然后在删除之前使用该表执行一些SQL.
伪代码:
open connection
begin transaction
CREATE TABLE #Temp ([Id] int NOT NULL)
bulk insert 500 rows into #Temp
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1)
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp
DROP TABLE #Temp
COMMIT TRANSACTION
CLOSE CONNECTION
Run Code Online (Sandbox Code Playgroud)
这在DROP语句上出错时失败:
无法删除表'#Temp',因为它不存在或您没有权限.
我无法想象如果没有其他事情首先发生这种失败是如何发生的,但在此之前我没有看到任何其他失败.
我有什么遗失可能会导致这种情况发生吗?
有没有办法创建转储/导出/保存临时MySQL表到磁盘上的文件(.sql文件,类似于mysqldump创建的文件)?
如果将Temp Table算法重命名为Unscalable算法会很好.当在视图定义中看到它时,它可能会给开发人员提供更多警告 - 类似于在解释结果中使用临时表时.在大多数情况下只是一个诙谐的请求,但实际上它对于不知情的人来说是灾难性的.
麻烦的是,如果你在视图定义中做某些事情,它将从合理的合并算法切换到无望的低效临时表算法.如果涉及的数据很少,这没什么大不了的.但是,随着数据的增长,这将会破坏您的性能.
尽管如何最好地处理这个问题?这是一个问题,因为观点是在5年前实施的,我不知道有任何修复它的努力.这种问题是否存在于其他流行的数据库系统中?
向下滚动到下面的链接,讨论何时不能使用合并算法来查看导致MySQL使用糟糕的Temp Table算法退化的原因:http: //mysql2.mirrors-r-us.net/doc/refman/ 5.1/EN /创建-view.html
这有什么不好的?临时表算法的工作原理如下:
所以你可以想象当你有一个5000万行表和一个视图定义时所涉及的地狱 - 愚蠢的例子,但你得到了重点:
create view last_order_date as
select max(order_date) last_date, username from orders group by username;
Run Code Online (Sandbox Code Playgroud)
然后用户可以写:
select * from last_order_date where username = 'joejoe22'
Run Code Online (Sandbox Code Playgroud)
2小时后返回结果......
那么如何最好地应对这种情况呢?
有没有办法在sybase中获取临时表的列列表?假设我有一个名为#mytable的表
select count (*) from tempdb..#mytable
Run Code Online (Sandbox Code Playgroud)
返回145表示此表中有145行.我尝试了以下(有一些变化)
select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = '#mytable'
Run Code Online (Sandbox Code Playgroud)
也试过了
select so.name from tempdb..syscolumns sc inner join tempdb..sysobjects so on sc.id = so.id where so.name = 'tempdb..#mytable'
Run Code Online (Sandbox Code Playgroud)
两人都回来了,结果空洞.
有任何想法吗?在sybase中获取临时表的列名的任何其他原语?
我们公司有一个简单的"crm-like"软件.有一些复杂的查询花了一些时间,每日使用查询...所以我测试一些修改使用临时表来替换我们需要的所有复杂的连接和子查询.
到目前为止进展顺利,速度达到90%以上.
由于它是一个网络应用程序(codeigniter + mysql),我打算把它放在"生产测试"环境中,所以50%的用户可以帮我测试它.我想监视活动的表,如果可能的话,监视每个连接.
我的问题是 - 有什么办法可以查看mysql实例中活动的所有TEMPORARY TABLES吗?也许查看其数据?
我读了一些关于插件或类似的东西,但这篇文章太乱了,我很理解.
非常感谢和抱歉我的英语 - 不是我的母语.
我正在尝试创建一个执行此操作的函数:
drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * from t_rv_openitem;
Run Code Online (Sandbox Code Playgroud)
当涉及到PostgreSQL中的函数时,我有时会感到困惑并得到此错误:
发生了错误:
错误:语法错误在"DROP"处或附近第3行:DROP TABLE t_rv_openitem;
我知道这似乎是一个简单的任务,但我正在试图解决这个问题.
这是完整的函数create语句:
CREATE OR REPLACE FUNCTION adempiere.update_t_rv_openitem()
RETURNS rv_openitem AS
$BODY$
Drop table t_rv_openitem;
select * into t_rv_openitem from rv_openitem;
select * From t_rv_openitem;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION adempiere.update_t_rv_openitem() OWNER TO adempiere;
Run Code Online (Sandbox Code Playgroud) 背景:
我想在一些临时表中存储一些临时结果.这些表可以在几个可能在时间上接近的查询中重用,但在某些时候我正在使用的进化算法可能不再需要一些旧表并继续生成新表.可能会有几个查询,可能同时使用这些表.只有一个用户执行所有这些查询.我不知道这是否澄清了关于会话的所有内容等等,我仍然不确定它是如何工作的.
目标:
我想要做的是创建临时表(如果它们已经不存在),尽可能将它们存储在内存中,如果在某些时候没有足够的内存,则删除那些将被提交给临时表的内存.硬盘(我猜这些将是最近最少使用的).
示例:
客户端将对具有不同参数的EMA进行查询,并且它们具有不同系数的聚合,每个个体可以根据所使用的系数而变化,因此EMA的参数可以重复,因为它们仍然在基因库中,并且可以一段时间后不需要.将有更多参数的类似查询,遗传算法将找到参数的正确值.
问题:
解决方法:
在最糟糕的情况下,我应该能够猜测我可以保留多少个内存表并尝试自己实现LRU,但它永远不会像Postgres那样好.
非常感谢你.
如果在SQL Server中使用"insert into"创建临时表,则使用第一个插入来确定列是否接受空值.如果第一个插入具有空值,则该列可以为空,否则它将是不可为空的.
有没有办法使用"insert into"创建临时表来接受空值?
例
这没有任何问题
Select 'one' as a , null as b
into #temp
insert into #temp
Select 'two' as a , 500 as b
Run Code Online (Sandbox Code Playgroud)
但是这会抛出"无法将值NULL插入列'b'"
Select 'one' as a , 500 as b
into #temp
insert into #temp
Select 'two' as a , null as b
Run Code Online (Sandbox Code Playgroud)
我知道我可以做create Table或alter column声明,但我想这样做而不重写数百个现有的查询.
我想为任何存储过程提供一些信息,例如当前用户.按照此处指出的临时表方法,我尝试了以下方法:
1)打开连接时创建临时表
private void setConnectionContextInfo(SqlConnection connection)
{
if (!AllowInsertConnectionContextInfo)
return;
var username = HttpContext.Current?.User?.Identity?.Name ?? "";
var commandBuilder = new StringBuilder($@"
CREATE TABLE #ConnectionContextInfo(
AttributeName VARCHAR(64) PRIMARY KEY,
AttributeValue VARCHAR(1024)
);
INSERT INTO #ConnectionContextInfo VALUES('Username', @Username);
");
using (var command = connection.CreateCommand())
{
command.Parameters.AddWithValue("Username", username);
command.ExecuteNonQuery();
}
}
/// <summary>
/// checks if current connection exists / is closed and creates / opens it if necessary
/// also takes care of the special authentication required by V3 by …Run Code Online (Sandbox Code Playgroud) temp-tables ×10
mysql ×4
sql ×3
postgresql ×2
sql-server ×2
ado.net ×1
algorithm ×1
caching ×1
merge ×1
mysqldump ×1
null ×1
plpgsql ×1
session ×1
sql-drop ×1
sybase ×1
transactions ×1
views ×1