MySQL的“create schema”和“create database” - 有什么区别吗?

137

浏览 information_schema 数据库并查看其中一个我自己的项目的元数据时,我很难理解 MySQL 中 create schema 命令和 create database 命令之间是否有任何区别。

它们之间有区别吗? 如果没有,这是否是关系数据库的常见行为模式(我听说对于其他数据库,如 Oracle,模式存在于数据库中,而不是与数据库处于相同级别)。

谢谢!

7个回答

183

MySQL文档中提到:

CREATE DATABASE使用给定的名称创建数据库。要使用此语句,您需要拥有该数据库的CREATE权限。从MySQL 5.0.2开始,CREATE SCHEMA是CREATE DATABASE的同义词。

因此,这两个指令看起来应该具有相同的功能。


1
太好了!我假设模式是数据库实例的一部分。非常感谢!! - asgs

35

Mysql文档中提到:从MySQL 5.0.2开始,CREATE SCHEMA是CREATE DATABASE的同义词。


这一切都可以追溯到20世纪80年代中期SQL的ANSI标准。

该标准有一个"CREATE SCHEMA"命令,它用于为表和视图名称引入多个命名空间。所有表和视图都在一个"schema"中创建。我不知道那个版本是否定义了一些跨模式访问表和视图的方法,但我认为它确实这样做了。至少在那个时候,没有任何产品真正实现它,整个概念更多的是理论而非实践。

另一方面,我记得这个标准版本没有"user"或"CREATE USER"命令的概念,因此有些产品使用了"用户"(然后拥有自己的表和视图名称空间)的概念来实现其等效的"模式"。

这是系统之间存在差异的领域。

就管理而言,这应该并不重要,因为这里你们本来就有所不同。

就应用程序代码而言,您“只需要”关注一个应用程序访问多个命名空间的情况。据我所知,所有系统都支持一种语法".",因此无论名称空间是用户、"schema"还是"database",这都不会有太大影响。


@DerMike 我记得,http://www.internetslang.com/ISTR-meaning-definition.asp - reevesy
2
正确的做法是提供原始来源的引用,即这个答案的来源:http://lists.mysql.com/mysql/211647 - informatik01
除非 Adinochestva 是原贴作者。 - FanaticD
1
SQL Server 实现了 SCHEMA 作为数据库中一组表/类型/.. - sridesmet
当时(至少在那个时候),没有任何产品真正实施它,这是不正确的,因为PostgreSQL和MSSql确实实现了它。请参阅Nicolas的回答。 - pdem

12

严格来说,在 MySql 中,数据库(Database)模式(Schema)之间的区别不存在。

然而,在其他数据库引擎如 SQL Server 中,情况并非如此。在 SQL Server 中:

每个表都属于数据库中被称为数据库模式的对象分组。它是一个容器或命名空间(Querying Microsoft SQL Server 2012

默认情况下,SQL Server 中的所有表都属于名为dbo的默认模式。当您查询尚未分配到任何特定模式的表时,可以执行以下操作:

SELECT *
FROM your_table

这相当于:

SELECT *
FROM dbo.your_table

现在,SQL Server 允许创建不同的模式,这样可以将共享相似目的的表进行分组,有助于组织数据库。例如,您可以创建一个名为 "销售" 的模式,其中包括诸如 "发票"、"信用订单"(以及与销售相关的任何其他表),还可以创建另一个名为 "查找" 的模式,其中包括诸如 "国家"、"货币" 和 "订阅类型"(以及用作查找表的任何其他表)。将分配给特定域的表在 SQL Server Studio Manager 中显示为表名前缀为模式名称的形式(与属于默认 "dbo" 模式的表完全相同)。SQL Server 中还有一些特殊的模式,引用同一本书:
有几个内置的数据库模式,它们不能被删除或更改: 1) dbo,默认模式。 2) guest 包含对“访客用户”(“访客用户”是 SQL Server 术语中的特殊角色,具有一些默认和高度限制的权限)可用的对象。很少使用。 3) INFORMATION_SCHEMA,由信息模式视图使用。 4) sys,专为 SQL Server 内部使用而保留。
模式不仅用于分组。实际上,可以为每个模式分别给不同的用户授予不同的权限,如MSDN所述。
通过这种方式,上面提到的模式< strong>lookup可以使任何标准用户在数据库中可用(例如仅SELECT权限),而名为supplierbankaccountdetails的表可能被分配到称为financial的不同模式中,并且只向组accounts中的用户授予访问权限(这只是一个示例,你明白了吧)。

最后,引用同一本书的话:

它并不是相同的数据库模式表模式。前者是表的命名空间,而后者是指表的定义。


8

7

数据库是一组模式的集合,而模式是表的集合。但在MySQL中,它们使用相同的方式。


2
因此,MySQL的“数据库”和MySQL的“模式”之间没有区别:这两个名称是同一事物的命名空间,用于表和其他数据库对象。
对于有Oracle背景的人: MySQL的“数据库”(也称为MySQL的“模式”)对应于Oracle模式。 MySQL和Oracle CREATE SCHEMA命令之间的区别在于,在Oracle中,CREATE SCHEMA命令实际上并不创建模式,而是将其填充到表和视图中。 而Oracle的CREATE DATABASE命令与其MySQL的命令有很大的不同。

2

MySQL的"database"和"schema"没有区别:它们是同一件事情的两个名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接