我只想要一个快速的方法(最好不要使用while循环)来创建一个日期@x和日期@y之间的每个日期的表,这样我就可以将外部联接留给一些统计表,其中一些表没有确定的记录介于两者之间,允许我用0来标记缺失的日子
在用户在特定日期之间免费搜索酒店时寻找临时保存搜索结果的方法时,我遇到了临时表.
但是即使在mysql手册中也没有回答某些问题......就像......
临时表对于执行脚本的每个用户都是唯一的吗?或者当两个不同的用户同时运行脚本时它会被覆盖......?
桌子何时会被销毁..?当用户关闭浏览器窗口或只是导航脚本运行的页面时......?
谢谢你的澄清......
这是我怎么做的....
$table = "CREATE OR REPLACE TEMPORARY TABLE $free_room(
room_id INT(5),
room_name VARCHAR(150),
max_persons INT(1),
rooms_free INT(1),
room_price INT(6),
hotel_id INT(4),
hotel_name VARCHAR(100),
hotel_stars INT(1),
hotel_type INT(1)) ENGINE=MEMORY";
$query_getFreeRooms = "INSERT INTO $free_room
SELECT $rooms.room_id,
$rooms.room_name,
$rooms.max_persons,
$rooms.total_rooms - $rooms.booked_rooms AS rooms_free,
$rooms.room_price,
$hotels.hotel_id,
$hotels.hotel_name,
$hotels.hotel_stars,
$hotels.hotel_type
FROM $hotels,$rooms
WHERE $rooms.room_id NOT IN (SELECT room_id
FROM $reservations
WHERE $dateCheck)
AND $hotels.hotel_city = '$city_search1'
AND $hotels.hotel_id = $rooms.hotel_id
AND $hotels.hotel_deleted = '0'
AND $rooms.room_deleted = '0'";
Run Code Online (Sandbox Code Playgroud) 临时表的目的是什么,如下面的语句?它与常规表有什么不同?
CREATE TEMPORARY TABLE tmptable
SELECT A.* FROM batchinfo_2009 AS A, calibration_2009 AS B
WHERE A.reporttime LIKE '%2010%'
AND A.rowid = B.rowid;
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置临时表以进行单元测试.到目前为止,我设法创建一个复制现有表结构的临时表:
CREATE TEMP TABLE t_mytable (LIKE mytable INCLUDING DEFAULTS);
Run Code Online (Sandbox Code Playgroud)
但这缺乏原始表中的数据.我可以使用CREATE TABLE AS语句将数据复制到临时表中:
CREATE TEMP TABLE t_mytable AS SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)
但是结构t_mytable将不相同,例如列大小和默认值不同.是否有一个复制一切的声明?
我在使用第一个查询时遇到的另一个问题LIKE是,关键字段引用原始表的ID序列,因此在插入时递增它.有没有简单的方法来复制单元测试表的序列,还是我必须手动设置新的序列?
我有这个问题:
DECLARE
@ProjectID int = 3,
@Year int = 2010,
@MeterTypeID int = 1,
@StartDate datetime,
@EndDate datetime
SET @StartDate = '07/01/' + CAST(@Year as VARCHAR)
SET @EndDate = '06/30/' + CAST(@Year+1 as VARCHAR)
SELECT tblMEP_Sites.Name AS SiteName, convert(varchar(10),BillingMonth ,101) AS BillingMonth, SUM(Consumption) AS Consumption
FROM tblMEP_Projects
JOIN tblMEP_Sites
ON tblMEP_Projects.ID = tblMEP_Sites.ProjectID
JOIN tblMEP_Meters
ON tblMEP_Meters.SiteID = tblMEP_Sites.ID
JOIN tblMEP_MonthlyData
ON tblMEP_MonthlyData.MeterID = tblMEP_Meters.ID
JOIN tblMEP_CustomerAccounts
ON tblMEP_CustomerAccounts.ID = tblMEP_Meters.CustomerAccountID
JOIN tblMEP_UtilityCompanies
ON tblMEP_UtilityCompanies.ID = tblMEP_CustomerAccounts.UtilityCompanyID
JOIN tblMEP_MeterTypes
ON …Run Code Online (Sandbox Code Playgroud) 我正在尝试为网站编写搜索功能,我已经决定使用MySQL临时表来处理数据输入的方法,通过以下查询:
CREATE TEMPORARY TABLE `patternmatch`
(`pattern` VARCHAR(".strlen($queryLengthHere)."))
INSERT INTO `patternmatch` VALUES ".$someValues
Run Code Online (Sandbox Code Playgroud)
$someValues具有布局的一组数据在哪里('some', 'search', 'query')- 或者基本上是用户搜索的数据.然后我images根据表中的数据搜索我的主表,patternmatch如下所示:
SELECT images.* FROM images JOIN patternmatch ON (images.name LIKE patternmatch.pattern)
Run Code Online (Sandbox Code Playgroud)
然后我根据每个结果与输入匹配的程度应用启发式或评分系统,并通过启发式等显示结果.
我想知道创建临时表需要多少开销?我知道它们只存在于会话中,并在会话结束后立即被删除,但如果我每秒有数十万次搜索,我会遇到什么样的性能问题?有没有更好的方法来实现搜索功能?
似乎SQLAlchemy的最大缺点是在处理临时表时需要几个步骤.例如,一个非常常见的用例是创建一个特定于一个任务的临时表,在其中抛出一些数据,然后加入它.
对于初学者来说,声明一个临时表是冗长的,并且是有限的.请注意,在这个例子中我必须编辑它,因为我的类实际上继承了一个基类,所以我在这里给出的可能稍微不正确.
@as_declarative(metaclass=MetaBase)
class MyTempTable(object):
__tablename__ = "temp"
__table_args__ = {'prefixes': ['TEMPORARY']}
id = Column(Integer(), primary_key=True)
person_id = Column(BigInteger())
a_string = Column(String(100))
Run Code Online (Sandbox Code Playgroud)
创建它是不直观的:
MyTempTable.__table__.create(session.bind)
Run Code Online (Sandbox Code Playgroud)
除非我做一些有创意的事情来使用ON COMMIT DROP进行渲染,否则我还必须记住明确删除它:
MyTempTable.__table__.drop(session.bind)
Run Code Online (Sandbox Code Playgroud)
而且,除非临时表完成"顶级",否则我刚刚给出的内容甚至不起作用.我还没有完全弄明白(因为不想花时间调查它为什么不起作用),但基本上我尝试使用session.begin_nested()和你在嵌套事务中以这种方式创建一个临时表最终得到一个错误,说该关系不存在.但是,我有几种情况我在嵌套事务中创建临时表以进行单元测试,它们工作得很好.检查回声输出,看来差别在于一个在BEGIN语句之前呈现,而另一个在它之后呈现.这是使用Postgresql.
什么在嵌套事务中工作,并且坦率地为您节省了大量时间,就是输入该死的sql并使用session.execute执行它.
session.execute(text(
"CREATE TEMPORARY TABLE temp ("
" id SERIAL,"
" person_id BIGINT,"
" a_string TEXT"
") ON COMMIT DROP;"
))
Run Code Online (Sandbox Code Playgroud)
当然,如果你这样做,你仍然需要一个相应的表模型来使用ORM功能,或者必须坚持使用原始的SQL查询,这首先会破坏SQLAlchemy的目的.
我想知道我是否在这里遗漏了一些东西,或者有人提出了一个更优雅的解决方案.
我有以下程序:
CREATE PROCEDURE foo ()
SELECT * FROM fooBar INTO TEMP tempTable;
-- do something with tempTable here
DROP TABLE tempTable;
END PROCEDURE;
Run Code Online (Sandbox Code Playgroud)
如果在调用DROP TABLE之前发生异常会发生什么?foo退出后,tempTable还会出现吗?
如果是这样,foo可能会在下次调用时失败,因为tempTable已经存在.应如何处理.
编辑:我正在使用informix 11.5
我多次看到这个问题,但我找不到让我满意的答案。基本上人们和书籍所说的是“虽然临时表在超出范围时会被删除,但您应该在不再需要它们时显式删除它们以减少服务器上的资源需求”。
我很清楚,当您在管理工作室工作并创建表时,在关闭窗口或断开连接之前,您将使用该表的一些资源,从逻辑上讲,最好删除它们。
但是当你使用过程时,如果你想清理表,你很可能会在它真正结束时这样做(我不是在谈论当你真的不需要它时你立即删除表的情况程序)。所以工作流程是这样的:
当您投入 SP 时:
据我所知,当你不放弃时它怎么可能工作:
这里有什么区别?我只能想象需要一些资源来识别临时表。还有其他想法吗?
更新:
我用 2 个 SP 进行了简单的测试:
create procedure test as
begin
create table #temp (a int)
insert into #temp values (1);
drop table #temp;
end
Run Code Online (Sandbox Code Playgroud)
另一个没有 drop 语句。我启用了用户统计并运行了测试:
declare @i int = 0;
while @i < 10000
begin
exec test;
SET @i= @i + 1;
end
Run Code Online (Sandbox Code Playgroud)
如图所示,当我不删除临时表时,所有统计数据都相同或有所减少。
更新2:
我第二次运行了这个测试,但现在有 10 万次调用,并且还添加了 SET NOCOUNT ON。这些是结果:

由于第二次运行确认,如果您不删除 SP 中的表,那么您实际上节省了一些用户时间,因为这是由其他一些内部进程完成的,但在用户时间之外。
正如标题所说,我正在尝试将 CSV 插入到临时表中。不幸的是,我遇到了错误。
这是查询:
USE DATABASE5000
CREATE TABLE #tempTable1
(
ID INT,
CD VARCHAR(50),
ESD DATETIME,
EED DATETIME,
MiscDate DATETIME,
SQ SMALLINT
)
BULK INSERT #tempTable1
FROM 'C:\Dir\Folder\BestFile.csv';
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
消息 4832,级别 16,状态 1,第 1 行
批量加载:数据文件中遇到意外的文件结尾。消息 7399,级别 16,状态 1,第 1 行
链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供者没有提供有关错误的任何信息。消息 7330,级别 16,状态 2,第 1
行无法从链接服务器“(空)”的 OLE DB 提供程序“BULK”中获取一行。
有任何想法吗?谢谢你们。
temp-tables ×10
sql ×5
sql-server ×4
mysql ×3
postgresql ×2
bulkinsert ×1
create-table ×1
database ×1
date ×1
informix ×1
performance ×1
php ×1
procedure ×1
python ×1
sqlalchemy ×1