日期:2013-12-17  浏览次数:20429 次

开发者们应该知道,使用那些非标准的SQL命令(比如Oracle、微软和MySQL等数据库系统)存在程度相当高的危险。也就是说,从跨平台和恪守标准的角度出发,你应该尽量采用ANSI SQL,它是一种和平台无关的数据库言语。不管你在使用哪种数据库系统,如果它完全支持SQL那么它就应该支持ANSI SQL-92标准。可是,“应该支持”和“确实支持”完全是两码事。在进行DBMS跨平台编程的时候,并不是所有的系统都完全支持ANSI SQL标准。这篇文章宗旨就是提出使用非标准SQL时所存在的风险及其相关的建议。


别使用存储过程

在某些编程环境下,出于效率和安全等方面的缘由,存储过程成为程序员开发数据库使用程序的独一方法。Visual Basic、C和Java程序员都并不需求了解SQL。然而,在其他某些编程环境下,存储过程又是完全禁用的。MySQL通常和Apache Web服务器组合使用,这是由于这两种软件不只免费、可靠而且功用强大,但是,恰恰是MySQL不支持存储过程。


--------------------------------------------------------------------------------

存储过程的定义 
所谓存储过程就是组成一个逻辑单元而且执行特别任务的一组SQL语句。存储过程用来封装针对数据库服务器的一整套操作或查询。

--------------------------------------------------------------------------------

Oracle和SQL服务器两者都包括了“内建”的存储过程,其使用也是很方便的。可是,如果明智的话千万别指望它们,你无法保证数据库管理员能否锁定、删除或修正了这些存储过程。如果你发现可用的某些存储过程正是你需求的,你这才可以在本人的代码中使用它们的功用。

通常,你能在Oracle或SQL Server上使用存储过程但在MySQL上则无法利用。如果你确实用到了它们,那么你得保证本人没有用到同特定平台相关的命令(当前讨论)。

别使用连接
连接是Oracle和SQL Server 这两种DBMS上令人头痛的一个问题,由于这两种系统在连接的概念上有基本的不同。基本上,各个DBMS的连接任务原理不总是一样的,而且你最终可能会得到不测的结果集合。在我们谈论各个系统有关连接的概念差别以及如何处理这些问题之前,你应该理解基本的连接子句:

连接
Join(连接)是从多个数据源获取数据的SQL数据表创建命令。 
等连接
Equi-Join从两个独立的数据源获取数据并把它们组合成一个大表。 
内/外连接
内连接(Inner Join)把两个表的内部列连接起来。外连接把两个表的外部列连接起来。 
左/右连接
左连接(Left Join)连接两个表左边的列。右连接则连接两个表左边的列。 
复合/复杂连接
其他各种连接—左/内、左/外、右/内和右/外等。 
反正你得记清楚了,如果你想要本人的使用程序能在各种数据库服务器上都能任务那么就别使用连接。

ANSI SQL:CREATE, DROP, ADD, UPDATE, DELETE, INSERT, SELECT
总之,你该当用到的独一命令如下: 

数据定义言语(DDL)下的CREATE 和DROP。 
数据操作言语(DML)下的ADD、UPDATE、DELETE和INSERT 。 
获取数据的SELECT。 
如果你在这些命令中使用了区分大小写的表格或字段名,或者这些名字包含了空格或其它特殊字符,那么你最好用方括号把名字围起来。这样做有助于防止非标准字符引发DBMS的不正常反应。



援用的完整性:键和数据类型

使用关系数据库的决定性缘由就是明确数据之间的关系而且维持那些关系的完整性。这样才能让开发者以最小的冗余性、最高效的方式存储数据。键定义了关系。数据类型定义了存储和操作数据的规则。这些就是一个数据库的基本方面,但是具体的语法却可能由于数据库的不同而不同。

数据类型
只要很少部分的数据类型得到所无数据库服务器的支持。每一种DBMS都有它本人的数据类型以及为什么要这样使用它们的缘由。某些专无数据类型(比如Microsoft Access的AUTONUMBER)用起来确实相当方便。

以下是ANSI数据类型:
BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR

以下是Oracle/Access/SQL不支持的“标准”数据类型:
INTERVAL, TIME, VARBIT

只要Oracle才支持DATE,但是以下的“标准”数据类型不被Oracle支持:
BIT, DECIMAL, NUMERIC, TIMESTAMP

以下的“标准”数据类型不被Access支持:
BIT, CHARACTER, DATE, NUMERIC, SMALLINT, TIMESTAMP

这样,只要以下的数据类型可以保证在各类数据库上都能使用:
DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR



主/外键

假设某个表内有两个字段,创建这个表的语法如下: 
CREATE TABLE [MyTable] ([FieldA] VARCHAR, [FieldB] VARCHAR);

为了添加主键以便表内的每一条记录都独一标识你可以采用PRIMARY KEY 表达式:
CREATE TABLE [MyTableA] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR);

在创建另一个表,其中一个字段索引第1个表,你可以把该字段定义为同第1个表的字段具有关系的外键:

CREATE TABLE [MyTableB] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR, [FieldC] VARCHAR REFERENCES [MyTableA]([FieldA]))

在以上例子中,所有的字段都是VARCHAR类型;但是你得记住,某一数据类型字段只能索引同一数据类型的字段。


ODBC 和 JDBC
如果你在编写的使用程序要用到SQL数据库连接,那么你可以用ODBC完成该功用。如果它是一个Java使用程序则可以用JDBC(简而言之就是ODBC的Java接口)。

由于你希望本人的使用程序最好不要惹起管理员的留意,所以你应该为你用户的DBMS包括所有必要的ODBC驱动程序。这样,如果用户从一个平台转移到另一个平台,它们所需求的驱动程序却曾经事先拥有了。

你的使用程序应该通过编程的方式决定当前用到的ODBC驱动程序对应何种DBMS。这样你才能用上那些数据库服务器上强大的、同特定平台相关的命令。

另类浏览器之战 
最流行的浏览器当然是微软的Internet Explorer和Netscape的Navigator了。但是,不管你手头用的是哪一种,它能保证支持现有的所有网站吗?错!很多花哨的东西,比如DHTML、框架以及多媒体等等都各自遭到两类浏览器中非标准的HTML标签的支持。

由于程序在这两种国际标准的岔路口无所适从,所以你必须为两种浏览器编写代码或者编写最具普遍性的功用代码而放弃大量的动态内容。

数据库服务器也面临同样的问题。ANSI SQL-92是人人赞同的标准。然而,Oracle、微软以及其他数据库厂商还自作主张加入了很多破坏SQL代码的特性。因此,你不只得编写服从基本规范(SQL-92)的代码,而且的代码还得依据具体用到的产品实现不同的特性。

在你本人的使用程序内,你必须正确地决定使用程序将使用什么类型的数据库,而且数据库应该定位在哪里。你还得老练地处理使用程序或用户产生的任何错误。你当然不希望仅仅由于文件被删除或者网线连接松弛就导致程序崩溃(或服务