如果插入查询执行完成,则更改表名
Posted
技术标签:
【中文标题】如果插入查询执行完成,则更改表名【英文标题】:Alter table name if insert query execution is completed 【发布时间】:2013-08-19 11:11:38 【问题描述】:我想以相同的顺序(step1、step2 和 step3)执行以下查询。
问题:
第 2 步中的插入查询需要更多时间来完成插入。由于这个 alter rename 查询失败。
第 1 步:创建如下表结构:
CREATE TABLE IF NOT EXISTS `app_summary` (
`date` date NOT NULL,
`app_id` smallint(6) NOT NULL,
`datetimes` datetime NOT NULL,
KEY `date` (`date`),
KEY `app_id` (`app_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
第 2 步:使用此查询填充表
INSERT INTO app_summary(date, app_id, datetimes)
SELECT
DATE_FORMAT(CONVERT_TZ(job.datetimes, '+00:00', '+05:30'), '%Y-%m-%d') AS dates,
job.app_id,
MAX(job.datetimes) AS datetimes
FROM
ijob AS job
WHERE 1
GROUP BY
dates, app_id
ORDER BY
NULL
第 3 步:重命名表
ALTER TABLE app_summary RENAME TO summary;
请帮我解决这个问题。
【问题讨论】:
ijob 表中有多少条记录? 它包含一个 CRORE 数据 您听说过触发器吗? 是的,我知道..我会尝试玩 @Dipesh Parmar 是否可以在没有为每行条件更改查询的情况下执行触发器是不可能的 【参考方案1】:您可以使用mysqli_multi_query 来尝试解决您的问题。
这可能更像是一种黑客行为。我的另一个选择是在INSERT
返回影响使用的行数后检查:
if ($mysqli->affected_rows > 0)
//RUN THE RENAME QUERY
else
//TRY THE INSERT AGAIN.
如果是$mysqli->affected_rows > 0
,那么您可以执行重命名部分,否则尝试再次运行INSERT
。总而言之,您应该看看在处理如此大的插入时是否不能提高表和 mysql 服务器本身的性能。
【讨论】:
【参考方案2】:您的代码应如下所示:
$sql = 'CREATE TABLE....';
mysqli_($sql);
$sql = 'INSERT INTO ...';
mysqli_query( $sql );
$sql = 'ALTER TABLE ...';
mysqli_query( $sql );
这样他们互相跟随。
您可以通过删除 2 个 KEY 语句并使用 ALTER 语句恢复它们来加快插入速度。
【讨论】:
这会因为插入查询中的大数据而失败 OK - 然后在 mysql 过程中执行此操作,如果您需要定期重复该过程,您可以在此过程中设置计时器。以上是关于如果插入查询执行完成,则更改表名的主要内容,如果未能解决你的问题,请参考以下文章