如何检测表是否存在?MySql

3

我被建议这样做

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

然而,它并不可靠,并且在Windows和Linux上的几个版本中会导致错误。也许还有其他方法。有人知道吗?这个问题是我可以创建表,如果不存在,但我需要第二次添加FK约束。在我的SQL转储中,我看到一个单表格中包含超过130个内容。该表只有6列,其中只有两列需要约束。每次重新启动Apache服务器或每当mono感觉需要调用我的Webapp中的全局init方法时,约束都会不断增加。

3
“show tables” SQL对您来说不好吗? - Yehonatan
@Yehonatan:在MySQL中,SHOW TABLES是INFORMATION_SCHEMA.TABLES的同义词-请参见页面底部:http://dev.mysql.com/doc/refman/5.1/en/tables-table.html - OMG Ponies
有趣的是,Yehonatan没有展示它,而我可以在其上编写WHERE语句。 - user34537
2个回答

2
看起来你需要使用FLUSH TABLES命令,才能让 INFORMATION_SCHEMA.TABLES 反映出现有的表。

参考:


1
如果你现在唯一的实际问题是不断重建外键(除了可能由于其他问题而导致的MySQL安装损坏),为什么不这样做:
1)给它一个约束符号(应该在数据库中是唯一的),让添加失败时静默/捕获它们?
ALTER TABLE tbl ADD CONSTRAINT only_one_please FOREIGN KEY (columnname) ...

2) 或者更好的方法是,在你的create table中一开始就添加外键约束?

至于原始问题:我不知道为什么会发生这种情况,也无法重现。从information_schema中选择是检查这个问题的首选方式,而且我还没有遇到过失败的情况。除了像SELECT * FROM tablename LIMIT 0;这样的暴力检查并检查错误之外,你可能首先要检查除了MySQL查询缓存之外的任何其他缓存机制,如果它们不存在/不是问题,那么可以尝试使用SELECT SQL_NO_CACHE table_schema, table_name FROM information_schema.tables


看起来不同。我测试了一下,似乎工作正常。问题是这些FK是生成的(这是我们的ORM)。你建议怎么命名only_one_please?表中的FK数量已知,但其他表的信息不清楚(但其他表无关紧要?) - user34537
这样做可以吗?我可以在其他表上重复使用相同的名称(例如fk_0)吗?ALTER TABLE post ADD CONSTRAINT fk_{0} FOREIGN KEY ... - user34537
2
在其他表(唯一性约束每个数据库)上使用相同的符号是不允许的,因此可以根据tablename+fieldname或tablename+fk number (tablename_fk_0,tablename_fk_1等)来命名。 - Wrikken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接