Mysql 架构语法不同-为什么要创建表

Mysql 架构语法不同-为什么要创建表,mysql,sql,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_na

我看到的创建表的常见示例如下所示:

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;
然而,我看到的一个例子是这样的:

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;

具体地说,在create表上,就像它指定数据库和新表,并将它们包围在`’s中一样。原因是什么?一种方法比另一种方法有优势吗?

反勾号用于转义表名和列名

您可以这样做来使用关键字。例如,如果您想从中命名一个列,那么您需要反勾号。否则DB会将其解释为关键字

或者,如果您希望表名中有空格,比如我的表,顺便说一句,我建议不要这样做


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

当标识符包含特殊字符(如空格)或保留字(如组或顺序)时,反勾号是转义字符

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

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

它们使查询更难阅读,因为到处都是不必要的字符。 它们使得编写查询变得更加困难。我想对经常这样做的人的回击键开始断裂了。 它们鼓励或至少不鼓励使用困难的识别词。 它们使得在数据库之间移动代码变得更加困难。MySQL是少数使用反勾号作为转义字符的数据库之一。
当然,有些人对其中的一些观点有不同的看法,尽管我认为第二点和第四点比观点更真实。

好吧,像用户id这样的东西似乎没有必要,对吗?没错。但是有些人用它们来命名。但这完全取决于你。