仅当 MariaDB 中不存在表时才创建表

发布于

在 MariaDB 中,您可以使用语句的子句在创建之前检查数据库中是否已存在同名表。IF NOT EXISTS``CREATE TABLE

仅当尚不存在同名表时,才会创建该表。

示例

下面是一个演示示例:

CREATE TABLE IF NOT EXISTS t1 (
  c1 INT,
  c2 VARCHAR(10)
);

这里,是表名,括号之间的所有内容都是表定义(即列等)。t1

在这个示例中,仅当还没有调用的表时,才会创建该表。t1

检查表现在是否存在

我们可以查询表来检查该表现在是否存在:information_schema.tables

SELECT EXISTS (
    SELECT 
        TABLE_NAME
    FROM 
    information_schema.tables 
    WHERE 
    TABLE_SCHEMA LIKE 'zap' AND 
        TABLE_TYPE LIKE 'BASE TABLE' AND
        TABLE_NAME = 't1'
    );

输出:

1

这里,是数据库的名称,也是我正在检查其是否存在的表的名称。zap``t1

表示表存在。如果它不存在,我们会得到.1``0

尝试再次创建表

现在,如果我们尝试再次创建该表:

CREATE TABLE IF NOT EXISTS t1 (
  c1 INT,
  c2 VARCHAR(10)
);

我们没有收到错误:

Query OK, 0 rows affected, 1 warning (0.002 sec)

但我们确实收到了警告。

因此,让我们检查警告:

SHOW WARNINGS;

输出:

+-------+------+---------------------------+
| Level | Code | Message                   |
+-------+------+---------------------------+
| Note  | 1050 | Table 't1' already exists |
+-------+------+---------------------------+

正如预期的那样,它告诉我们该表已经存在。

没有条款IF NOT EXISTS

以下是我们在尝试创建已存在的表时不使用子句时发生的情况:IF NOT EXISTS

CREATE TABLE t1 (
  c1 INT,
  c2 VARCHAR(10)
);

这次我们收到一个错误:

ERROR 1050 (42S01): Table ’t1’ already exists

请注意,该子句不检查表结构/定义。它只是检查是否存在与我们尝试提供给我们正在创建的表的同名的现有表。IF NOT EXISTS

换句话说,仅仅因为该名称的表已经存在,并不意味着它具有正确的定义。