【问题标题】:MySQL: Create table if not exist always appending data instead of skip creating tableMySQL:如果不存在则创建表总是附加数据而不是跳过创建表
【发布时间】:2015-07-31 11:05:42
【问题描述】:

我有一个表“table1”并想创建另一个表,但将其存储在内存中(引擎=内存),其中包含来自 table1 的数据。

在我的测试服务器中,SQL 按预期工作 - 创建表一次,将数据从“table1”放入其中,下一次跳过插入,因为表“mem_table”已经存在。

在生产服务器 SQL 是意外的 - 它创建表“mem_table”,从“table1”插入数据。每次运行它都会一次又一次地插入数据。

SQL:

CREATE TABLE IF NOT EXISTS `mem_table` (
`f1` mediumint(9) NOT NULL AUTO_INCREMENT,
`f2` mediumint(9) NOT NULL,
`f3` varchar(100) NOT NULL
PRIMARY KEY (`f1`),
KEY `f3` (`f3`)
) ENGINE=MEMORY DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 SELECT NULL f1, f2, f3 FROM table1; 

【问题讨论】:

  • 这听起来像是服务器没有足够的内存来存储表的问题
  • @BryanZwicker - 我在 bdname.err 文件中发现错误“[ERROR] /usr/sbin/mysqld: The table 'mem_table' is full”,但我认为原因总是附加数据。你知道解决办法吗?
  • 您是否考虑过这些可能性? dev.mysql.com/doc/refman/4.1/en/full-table.html
  • @BryanZwicker 谢谢,看来问题出在 max_heap_table_size 限制中。
  • 太棒了。如果您不介意在我发布时接受,我会将我的评论转换为答案以供将来遇到此问题的人使用

标签: mysql create-table


【解决方案1】:

正如documentation 所说,这种行为取决于版本。

因此,解决方案不是在 CREATE TABLE 中使用“IF NOT EXISTS”。如果表存在,mysql只是返回错误,并没有一次又一次地插入数据。

CREATE TABLE `mem_table` (
`f1` mediumint(9) NOT NULL AUTO_INCREMENT,
`f2` mediumint(9) NOT NULL,
`f3` varchar(100) NOT NULL
PRIMARY KEY (`f1`),
KEY `f3` (`f3`)
) ENGINE=MEMORY DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 SELECT NULL f1, f2, f3 FROM table1;

【讨论】:

    【解决方案2】:

    通过我们的 cmets 发现您的问题:

    这似乎是没有为表分配内存的问题。

    了解 MySQL 内存表存储的常见问题:https://dev.mysql.com/doc/refman/4.1/en/full-table.html

    【讨论】:

    • 我发现,问题出在不同的版本行为上,而不取决于内存分配大小。我发布了一个解决方案作为答案。无论如何感谢您的帮助。
    • 我很高兴你知道了!抱歉,我无法提供更多帮助:)
    猜你喜欢
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多