架构语法不同 - 为什么环绕创建表

时间:2014-09-06 18:32:30

标签: mysql sql

我在创建表格时看到的正常例子如下:

CREATE TABLE supportContacts 
    (
     id int auto_increment primary key, 
     type varchar(20), 
     details varchar(30)
    );

然而,我看到的一个例子是这样的:

CREATE TABLE IF NOT EXISTS `main`.`user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `user_password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `user_email` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_name` (`user_name`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

具体来说,就像创建表一样,它指定了数据库和新表,并将它们包含在`中。这是什么原因,并且一种方式优于另一种方式?

2 个答案:

答案 0 :(得分:2)

当标识符包含特殊字符(例如空格)或保留字(例如grouporder)时,反引号是所需的转义字符。

否则,它们不是必需的,我认为这个create table语句中的任何标识符都不需要它们。

我个人的偏好是过度使用转义字符是一件坏事:

  • 它们使查询更难阅读,因为到处都有不必要的字符。
  • 他们使编写查询变得更加困难。我想这个做这件事的人的反击键很快就会破裂。
  • 他们鼓励(或至少不要劝阻)使用"困难" identifers。
  • 它们使得在数据库之间移动代码变得更加困难。 (MySQL是少数使用反引号作为转义字符的数据库之一。)

当然,有些人对其中的一些观点有不同的看法(虽然我认为第二点和第四点比事实更真实。)

答案 1 :(得分:1)

反引号用于转义表名和列名。

您可以执行此操作以使用关键字。例如,如果要命名列from,则需要反引号。否则,DB会将此解释为关键字。

或者,如果您希望表格中的空格如my table,我建议您不要这样做。

在SQL Server中,您可以使用[]来转义名称。