Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果不存在表,则创建表;如果存在表,则在创建前删除表,两者之间有什么区别?_Mysql_Sql_Database - Fatal编程技术网

Mysql 如果不存在表,则创建表;如果存在表,则在创建前删除表,两者之间有什么区别?

Mysql 如果不存在表,则创建表;如果存在表,则在创建前删除表,两者之间有什么区别?,mysql,sql,database,Mysql,Sql,Database,我一直在处理一个数据库,为了不复制表,我遇到了drop table if exists语句的一些问题。问题是,根据外键和包含的依赖关系,有一个顺序来考虑必须首先删除哪个表和第二个表等。但是还有其他语句允许在不存在表时创建表。如果不存在表,则已创建表\u名称,并且似乎正在执行相同的工作,而没有顺序问题。 我只需要知道这两种方式之间有什么不同,还有其他的条件要考虑吗? 是的,有区别。如果表存在,CREATETABLE If NOT exists不会执行任何操作,因此不会生成冲突 同样,如果表存在,D

我一直在处理一个数据库,为了不复制表,我遇到了drop table if exists语句的一些问题。问题是,根据外键和包含的依赖关系,有一个顺序来考虑必须首先删除哪个表和第二个表等。但是还有其他语句允许在不存在表时创建表。如果不存在表,则已创建表\u名称,并且似乎正在执行相同的工作,而没有顺序问题。
我只需要知道这两种方式之间有什么不同,还有其他的条件要考虑吗? 是的,有区别。如果表存在,CREATETABLE If NOT exists不会执行任何操作,因此不会生成冲突

同样,如果表存在,DROP table if exists将删除该表,并在需要该表时导致冲突

此外,正如其他人所说: -权限将被重置如果有意,这可能是一个加号;如果需要恢复权限,则这是一个缺点。 -删除表时,所有数据都将丢失。 -需要重新提交涉及表的视图、过程、函数和索引

由于所有这些原因,您可能不想使用DROP表,除非您不再需要该表

如果您这样做是为了将表重置为已知状态,则这是一种数据库气味-这意味着您在跟踪数据库更改时遇到问题。与其绕开这个问题,不如花点时间来理解为什么数据库会失控。您所做的任何更改都应该使用ALTER TABLE或CREATE INDEX来完成,并且应该一个接一个地撤消,以及如何使其恢复控制。这将在未来产生巨大的红利

在MySQL中,您可以设置外键检查=0。看

1如果您的更改导致数据丢失,例如您将VARCHAR30更改为VARCHAR15,则可以通过选择主键和仅受影响的字段来创建撤消表-创建表撤消_20161229_183415,如更改前使用旧值选择tbl.pkey、tbl.changedfield1、tbl.changedfield2。稍后,您可以更改回字段定义,并对表执行更新联接

注意:您可能希望首先添加一个将旧值转换为新格式的位置,并验证它是否与新表中的内容匹配:

2016-12-29.1    1234    PEOPLE'S REPUBLIC OF CHINA
2016-12-29.2    1234    PEOPLE'S REPUBLI    # the change was ill advised
2017-01-15      1234    TAIWAN              # the customer moved

在2月2日,当您想要向后扩展并恢复您的数据时,您想要用中华人民共和国的全名替换人民共和国。。。除了在这一条记录上,您绝对不想将PRC还原到现在的台湾。

删除然后创建将自然重置对表的所有权限,以及使用此表的查询的执行计划。使用此表的所有过程/函数也将无效

一般来说,在发布数据库更新时,它用于编写sql脚本,其中包含用于创建表或其他对象的语句

从这里开始,您可以遵循几种策略。Mysql似乎还支持创建一个脚本文件的策略,该脚本文件随更新一起附加,因此您将仅在第一次执行脚本时创建表,以下所有执行都不会创建表。当然,在这个场景中,您必须将if not exists子句添加到脚本文件的所有对象中

相反,一个更为遵循的策略是创建与db对象数量相同的多个文件,每个对象一个文件。因此,如果对象是一个表,那么首先要创建一个表,如果存在,就删除它,并解释另一条语句

当然,当您执行此表脚本文件时,您必须密切注意要保留以防丢失的db数据,以及由于可能影响删除操作的最终外键约束而导致的执行顺序

通常,此脚本仅在开发或测试环境中启动,或者在生产环境中首次安装db时启动


在prod env中,通常在更新db表对象时,启动只包含alter语句的脚本。

首先,如果不存在CREATE table,则可以防止丢失表中可能存在的任何数据。不同之处在于,您可以保留您的工作。如果您处于这种情况下,也许你应该重新考虑你的方法。