我被难住了,不知道如何开始处理这个问题。
基本上,我只想创建一个表,但如果它已经存在,则需要删除并重新创建它,而不是仅截断它;但如果它不存在,则只需创建它。
有没有人能帮忙?
我被难住了,不知道如何开始处理这个问题。
基本上,我只想创建一个表,但如果它已经存在,则需要删除并重新创建它,而不是仅截断它;但如果它不存在,则只需创建它。
有没有人能帮忙?
在CREATE TABLE
语句之前只需加上DROP TABLE IF EXISTS `tablename`;
语句。
该语句会删除表格(如果存在),但如果不存在,不会引发错误。
DROP TABLE IF EXISTS 'table1','table2';
和DROP VIEW IF EXISTS 'view1','view2';
PS-你使用了什么巫术在内联代码中有 `s!? - Campbeln只需使用 DROP TABLE IF EXISTS
即可:
DROP TABLE IF EXISTS `foo`;
CREATE TABLE `foo` ( ... );
如果您有其他问题,请先尝试搜索MySQL文档。
嗯...哎呀。多年来没有人提及一个微妙的事情。
尽管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 ...
操作后应该检查结果,如果出现错误则不继续进行操作。失败意味着其他线程尚未完成同一脚本,可能是由于在中途崩溃或尚未完成。最好自己检查一下。RENAME ...
的结果,在成功的情况下不要继续进行:整个操作已经成功完成;更重要的是,如果另一个线程已经开始了相同的序列,运行下一个RENAME ...
可能会导致不安全(最好考虑这种情况而不是不考虑,参见下面的锁定说明)。RENAME ...
原子性地替换了表定义,请参阅MySQL手册以获取详情。DROP ...
只是清除旧表。将所有语句用类似SELECT GET_LOCK('__upgrade', -1); ... DO RELEASE_LOCK('__upgrade');
包装起来,可以顺序调用所有语句而无需检查错误,但我认为这不是一个好主意:复杂度增加,并且MySQL中的锁定函数对基于语句的复制不安全。
如果表数据应该保留在表定义升级后... 对于一般情况,这是一个更加复杂的故事,涉及比较表定义以查找差异并生成适当的ALTER ...
语句,这并不总是可以自动完成,例如在重命名列时。
附注1:
您可以使用相同的方法处理视图,在这种情况下,CREATE/DROP TABLE
仅转换为CREATE/DROP VIEW
,而RENAME 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
感到满意,因为它已经关心了主题问题及其细节。
foo
(ignore int)”,这样第一个重命名就是不必要的?然后第二个重命名总是有效的,查询结束时当前表或虚拟表将被删除。 - Sebastian MendezDROP TABLE IF EXISTS foo; CREATE TABLE foo ...
,因此如果服务器在DROP
和CREATE
之间崩溃,则表将被删除但不会重新创建,最终你将没有任何表。我建议你使用上面描述的重命名方法,直到CREATE OR REPLACE
变成原子性操作。 - Adrian Wiik我需要删除一个表并重新创建一个包含来自视图的数据的表。我是通过以下方式创建一个基于视图的表:
DROP TABLE <table_name>;
CREATE TABLE <table_name> AS SELECT * FROM <view>;
我在使用MySQL MariaDb时,上述方法对我有效。
删除数组,如果它存在的话
。 - Shomz