如果存在表,则创建它,如果不存在,则创建它


151

我很沮丧,我不知道该怎么做。

基本上,我只想创建一个表,但是如果存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。

任何人都可以提供帮助吗?

谢谢乔治


@Shomz,这就是他们想要的。然而,这个问题的存在以及该页面的2万个视图证明了这就像将英语转换成希腊语一样容易。
Pacerier

2
@Pacerier无法同意更多:διαγραφή πίνακα, εφόσον υπάρχει
Shomz

@Shomz,有语法错误。
Pacerier

Answers:


298

放在DROP TABLE IF EXISTS `tablename`;您的CREATE TABLE发言之前。

该语句将删除该表(如果存在),但如果不存在则不会引发错误。


1
谢谢!这也适用于表或视图的列表!DROP TABLE IF EXISTS 'table1', 'table2';DROP VIEW IF EXISTS 'view1', 'view2';PS-您使用什么巫术来内联代码包含`s !?
坎贝尔

2
@Campbeln只需将代码段前后的反引号加倍即可。然后逐字显示单个反引号。
r3mainer

43

只需使用DROP TABLE IF EXISTS

DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );

如果您还有其他问题,请尝试首先搜索MySQL文档


8

好吧... 多年来,没有人提到一件微妙的事情。

尽管DROP TABLE IF EXISTS `bla`; CREATE TABLE `bla` ( ... );看似合理,但仍会导致旧表已经消失而新表尚未创建的情况:此时某些客户端可能会尝试访问主题表。

更好的方法是创建一个全新的表并将其与旧表交换(表内容丢失):

CREATE TABLE `bla__new` (id int); /* if not ok: terminate, report error */
RENAME TABLE `bla__new` to `bla`; /* if ok: terminate, report success */
RENAME TABLE `bla` to `bla__old`, `bla__new` to `bla`;
DROP TABLE IF EXISTS `bla__old`;
  • 您应该检查的结果,CREATE ...并且在出现错误的情况下不要继续,因为失败意味着其他线程没有完成相同的脚本:要么是因为它在中间崩溃了,要么就是还没有完成-这是一个好主意自己检查东西。
  • 然后,您应该先检查first的结果,如果成功RENAME ...,则不要继续:整个操作成功完成;更重要的是,如果另一个线程已经按相同的顺序启动了,则next运行可能(并且将会)是不安全的(覆盖这种情况要比不覆盖这种情况更好,请参见下面的锁定说明)。RENAME ...
  • 第二个RENAME ...原子替换表定义, 有关详细信息,请参见 MySQL手册
  • 最后DROP ...,显然是清理了旧表。

用类似的包装所有语句SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');允许只依次调用所有语句而不进行错误检查,但是我认为这不是一个好主意:复杂性增加,并且MySQL中的锁定函数对于基于语句的复制并不安全。

如果表数据应该在表定义升级后仍然存在...对于一般情况,有关比较表定义以找出差异并产生正确的ALTER ...语句的故事要复杂得多,这并非总是可以自动进行的,例如在重命名列时。

旁注1: 您可以使用相同的方法处理视图,在这种情况下,CREATE/DROP TABLE只需变换为即可,CREATE/DROP VIEWRENAME TABLE保持不变。实际上,您甚至可以将桌子变成视图,反之亦然。

CREATE VIEW `foo__new` as ...; /* if not ok: terminate, report error */
RENAME TABLE `foo__new` to `foo`; /* if ok: terminate, report success */
RENAME TABLE `foo` to `foo__old`, `foo__new` to `foo`;
DROP VIEW IF EXISTS `foo__old`;

旁注2: MariaDB用户应该对感到满意CREATE OR REPLACE TABLE/VIEW,它已经在乎主题问题了,这很不错。


1

我需要删除一个表并使用视图中的数据重新创建。我是根据视图创建表的,这就是我所做的:

DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;

以上使用MySQL MariaDb为我工作。


删除表table_name; 从视图中选择*创建表;
sirskoy

如果您使用的是MariaDB(MySQL缺少此功能),则可以简单地进行CREATE OR REPLACE <table_name> AS SELECT * FROM <view>;
Alex Offshore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.