主数据库和 mySQL 中是否存在错误?
我对 mySQL 和 SQL 都很陌生。我已经安装了 mysql workbench 和 mysql community server 来开始练习,就像我在许多教程中看到的那样。我有两个可能相互关联的问题。在许多脚本中,我看到了
USE master;
的用法,在我的 Workbench 版本(版本 8.0)中,当我尝试运行此查询时,提示“未知数据库‘master’。我不太确定 master 数据库有什么(我在 Google 上搜索过,我只知道在 master 数据库中创建自己的数据库是一种很好的做法)。
我的另一个问题更让我困惑,那就是当我使用 IF 时。
IF NOT EXISTS(SELECT name FROM master.dbo.sysdatabases
WHERE name = 'mydatabase')
CREATE DATABASE [mydatabase]
它一直给我错误:“IF 在此位置无效,预期为 EOF、ALTER、ANALYZE、BEGIN,...”
当我在 IF 之前使用 BEGIN 时,提示:IF 在此位置无效,预期为 EOF,';'
起初我以为它与 master 数据库有关,所以我尝试了一些不同:
IF OBJECT_ID('tablename','U') IS NULL
CREATE TABLE tablename(
....);
我遇到了同样的错误。我在 stackoverflow 上找到的唯一内容是: statement-is-not-valid-in-this-position 有人说“您不能在 SQL 语句中使用 IF。您只能在存储过程或函数中使用它” 如果是这种情况,我在网上找到的脚本如何以这种方式使用 IF 语句? 这是一个应该可以工作的 SQL 代码示例:
USE [master]
GO
IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases
WHERE name = 'HotelManagement')
CREATE DATABASE [HotelManagement] COLLATE Greek_CI_AI -- Collatiom : CI = Case Insensitive, AI = Accent Insensitive
GO
/* =====================
CREATE ENTITIES
======================*/
USE [HotelManagement]
GO
IF OBJECT_ID ('Customers', 'U') IS NULL
BEGIN
CREATE TABLE Customers
(
Customer_ID int IDENTITY(1,1) PRIMARY KEY,
First_name varchar (50) not null,
Last_name varchar (50) not null,
Birth_date datetime,
Issuing_authority varchar (50) not null,
Email varchar (50),
Phone varchar (50)
)
END
这很令人困惑,但每个品牌都有自己的 SQL 实现。
SQL 基于 ANSI 标准,但没有供应商实现整个标准。此外,SQL 标准允许供应商创建自己的 SQL 语言专有扩展。每个供应商至少都会这样做一点。
最重要的是,您不应该假设一个品牌数据库的 SQL 代码在另一个品牌上完全有效。由于它们都是基于 SQL,因此存在相似之处,但您确实需要分别研究每个品牌的文档。
您甚至需要研究所用数据库的特定 版本 的文档,因为每个供应商在每个版本中都会引入新功能(或弃用一些旧功能)。
以 MySQL 为例:
-
MySQL 不支持存储例程之外的复合语句(例如
IF/THEN/END IF
。请参阅 https://dev.mysql.com/doc/refman/8.0/en/sql-compound-statements.html -
MySQL 不支持方括号(
[ ]
)作为标识符分隔符。请参阅 https://dev.mysql.com/doc/refman/8.0/en/identifiers.html -
MySQL 的客户端使用分号 (
;
) 而不是GO
作为语句终止符。请参阅 https://dev.mysql.com/doc/refman/8.0/en/entering-queries.html -
MySQL 有一个名为
AUTO_INCREMENT
的列选项,而不是 Microsoft 使用的IDENTITY(1,1)
选项。请参阅 https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html
还有许多其他区别。等到您开始编写存储过程时再说吧!