【问题标题】:How do I detect if a table exist? MySql如何检测表是否存在? mysql
【发布时间】:2010-07-13 18:21:06
【问题描述】:

有人建议我这样做

SELECT table_schema, table_name FROM information_schema.tables
WHERE table_schema = 'mydb' AND table_name='ApprovePost';

不过不靠谱和cause me errors on several versions of mysql on windows and linux.

也许还有其他方法。有人知道吗?

这个问题是如果不存在我可以创建表,但我会进行第二次传递以添加 FK 约束。在我的 SQL 转储中,我看到 > 130 包含在单个表上。该表只有 6 列,其中只有两列需要约束。每次我重新启动 Apache 服务器或当 mono 觉得需要在我的 web 应用程序中调用我的全局 init 方法时,约束都会不断构建和构建。

【问题讨论】:

  • 'show tables' sql 对你不利吗?
  • @Yehonatan:SHOW TABLES 是 MySQL 上 INFORMATION_SCHEMA.TABLES 的同义词 - 见页面底部:dev.mysql.com/doc/refman/5.1/en/tables-table.html
  • 有趣,Yehonatan 没有显示它,我可以在上面写一个 WHERE。

标签: mysql constraints


【解决方案1】:

您似乎需要对 INFORMATION_SCHEMA.TABLES 使用 FLUSH TABLES 命令来反映现有表。

参考:

【讨论】:

    【解决方案2】:

    如果您现在唯一的实际问题是不断重新创建外键(考虑到您的其他问题,除了可能损坏的 MySQL 安装),为什么不:

    1) 给它一个约束符号(在数据库中应该是唯一的)并让添加失败/捕获它们?

    ALTER TABLE tbl ADD CONSTRAINT only_one_please FOREIGN KEY (columnname) ...
    

    2) 或者更好的是,首先在您的create table 中添加外键子句?

    至于最初的问题:我不知道为什么会发生这种情况,我无法重新创建它。从 information_schema 中选择是 afaik 相当首选的检查方式,并且还没有让我失望。除了像SELECT * FROM tablename LIMIT 0; 这样的蛮力检查和检查错误之外,您首先可能想要检查除MySQL 的查询缓存之外的任何其他缓存机制,如果它们不存在/不是问题,也许尝试SELECT SQL_NO_CACHE table_schema, table_name FROM information_schema.tables

    【讨论】:

    • 看起来不一样。我测试了它,它似乎工作。问题是生成了这些 FK(它是我们的 ORM)。你如何建议命名 only_one_please?表中的 FK 数量是已知的,但其他表上的信息不知道(但其他表无关紧要?)
    • 这样的事情可以吗?我假设我可以在其他表上重复使用相同的名称(例如 fk_0)? ALTER TABLE post ADD CONSTRAINT fk_{0} FOREIGN KEY ...,我
    • 您不能使用相同的符号来约束其他表(每个 database 唯一),因此命名可以基于 tablename+fieldname,或 tablename+fk number (tablename_fk_0、tablename_fk_1 等)。
    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2019-09-28
    • 2013-04-12
    相关资源
    最近更新 更多