mySQL 中的 master 数据库和 IF 错误?
master databse and IF errors in mySQL?
总的来说,我是 mySQL 和 sql 的新手。我已经安装 mysql workbench 和 mysql 社区服务器开始练习,正如我在许多教程中看到的那样。我有两个可能相互关联的问题。在许多脚本中,我看到
的用法
USE master;
在我的 workbench 版本(8.0 版)中,当我尝试 运行 时,此查询显示“未知数据库 'master'”。我不太确定主数据库有什么(我用谷歌搜索了一下,我只知道在 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,';'
起初我认为它与主数据库有关,所以我尝试了一些不同的方法:
IF OBJECT_ID('tablename','U') IS NULL
CREATE TABLE tablename(
....);
我遇到了同样的错误。我在 Whosebug 上发现的唯一一件事是:
有人说“您不能在 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
MySQL、微软SQL服务器(MSSQL)、Postgres等都是不同的关系数据库管理系统。它们都使用结构化查询语言 (SQL) 与特定服务器进行通信。每个都有自己不同的口味、樱桃和糖霜 - 但它们几乎运行相同的功能,而且大多数使用的语法 99% 相同。
您需要一个客户端 software/web 应用程序来 design/write/edit/delete/read/query 数据库引擎上的数据。这些称为客户端软件。有些可以 运行 在您的本地计算机上。其他人可能 运行 来自网页或您自己的网络服务器。
这很令人困惑,但每个品牌都有自己的实施 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
还有许多其他差异。等到你开始编写存储过程!
总的来说,我是 mySQL 和 sql 的新手。我已经安装 mysql workbench 和 mysql 社区服务器开始练习,正如我在许多教程中看到的那样。我有两个可能相互关联的问题。在许多脚本中,我看到
的用法USE master;
在我的 workbench 版本(8.0 版)中,当我尝试 运行 时,此查询显示“未知数据库 'master'”。我不太确定主数据库有什么(我用谷歌搜索了一下,我只知道在 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,';'
起初我认为它与主数据库有关,所以我尝试了一些不同的方法:
IF OBJECT_ID('tablename','U') IS NULL
CREATE TABLE tablename(
....);
我遇到了同样的错误。我在 Whosebug 上发现的唯一一件事是:
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
MySQL、微软SQL服务器(MSSQL)、Postgres等都是不同的关系数据库管理系统。它们都使用结构化查询语言 (SQL) 与特定服务器进行通信。每个都有自己不同的口味、樱桃和糖霜 - 但它们几乎运行相同的功能,而且大多数使用的语法 99% 相同。
您需要一个客户端 software/web 应用程序来 design/write/edit/delete/read/query 数据库引擎上的数据。这些称为客户端软件。有些可以 运行 在您的本地计算机上。其他人可能 运行 来自网页或您自己的网络服务器。
这很令人困惑,但每个品牌都有自己的实施 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
还有许多其他差异。等到你开始编写存储过程!