mysql数据库开发需要注意的问题

10.1数据库名、表名大小写问题

在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是MacOSX,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,MacOSX也支持UFS卷,该卷对大小写敏感,就像Unix一样。

注释:尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as
MY_tables:mysql>SELECT* FROMmy_tableWHERE MY_TABLE.col=1;列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。

默认情况,表别名在Unix中对大小写敏感,但在Windows或MacOSX中对大小写不敏感。

下面的查询在Unix中不会工作,因为它同时引用了别名a和A:

mysql>SELECT col_nameFROM tbl_nameASa

->WHEREa.col_name=1ORA.col_name=2;

然而,该查询在Windows中是可以的。要想避免出现差别,最好采用一致的转换,例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换。

在MySQL中如何在硬盘上保存和使用表名和数据库名lower_case_tables_name系统变量确定,可以在启动mysqld时设置。lower_case_tables_name可以采用下面的任一值:

含义
0 使用CREATETABLE或CREATEDATABASE语句指定的大写和小写在硬盘上保存表名和数据 库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写

不敏感的文件系统上用–lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。

1 表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存 储和查找。该行为也适合数据库名和表的别名。该值为Windows和MacOSX系统中的默认值。
2 表名和数据库名在硬盘上使用CREATETABLE或CREATEDATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释:只在对大

小写不敏感的文件系统上适用!InnoDB表名以小写保存,例如 lower_case_tables_name=1。

在Windows和MacOSX中,lower_case_tables_name的默认值是1。

如果只在一个平台上使用MySQL,通常不需要更改lower_case_tables_name变量。

然而,如果你想要在对大小写敏感不同的文件系统的平台之间转移表,会遇到困难。例如,在Unix中,my_tables和MY_tables是两个不同的表,但在Windows中,这两个表名相同。

要想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项:

在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW
TABLES或SHOWDATABASES时,看不出名字原来是用大写还是小写。

在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。

这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移到Unix中,由于在Unix中大小写很重要,如果大小写不正确,它们不工作。

例外:如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。

请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写

10.2使用外键需注意的地方

在MySQL中,InnoDB表支持对外部关键字约束条件的检查。

对于除InnoDB类型的表,当使用REFERENCEStbl_name(col_name)子句定义列时可以使用外部关键字,该子句没有实际的效果,只作为备忘录或注释来提醒,你目前正定义的列指向另一个表中的一个列。执行该语句时,实现下面很重要:

MySQL不执行表tbl_name中的动作,例如作为你正定义的表中的行的动作的响应而删除行;

换句话说,该句法不会致使ONDELETE或ONUPDATE行为(如果你在REFERENCES子句中写入ONDELETE或ONUPDATE子句,将被忽略)。

该句法可以创建一个column;但不创建任何索引或关键字。

如果用该句法定义InnoDB表,将会导致错误。

你可以使用作为联接列创建的列,如下所示:

CREATE TABLE person(

idSMALLINTUNSIGNEDNOTNULLAUTO_INCREMENT,

nameCHAR(60)NOTNULL,

PRIMARYKEY(id)

);
CREATE TABLE shirt(

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

style ENUM(‘t-shirt’,’polo’,’dress’) NOT NULL,

color ENUM(‘red’,’blue’,’orange’,’white’,’black’) NOT NULL,

owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),

PRIMARYKEY(id)

);
INSERT INTO person VALUES(NULL,’AntonioPaz’);
SELECT@last:=LAST_INSERT_ID();

INSERT INTO shirt VALUES

(NULL,’polo’,’blue’,@last),

(NULL,’dress’,’white’,@last),

(NULL,’t-shirt’,’blue’,@last);

INSERT INTO person VALUES(NULL,’LillianaAngelovska’);

SELECT@last:=LAST_INSERT_ID();

INSERT INTO shirt VALUES

(NULL,’dress’,’orange’,@last),

(NULL,’polo’,’red’,@last),

(NULL,’dress’,’blue’,@last),

(NULL,’t-shirt’,’white’,@last);
SELECT*FROMperson;

+—-+———————+

|id|name             |

+—-+———————+

| 1|AntonioPaz          |

| 2|LillianaAngelovska|+—-+———————+
SELECT * FROM shirt;

+—-+———+——–+——-+

|id|style |color |owner|

+—-+———+——–+——-+

| 1|polo  |blue |  1|

| 2|dress |white |  1|

| 3|t-shirt|blue |  1|

| 4|dress |orange|  2|

| 5|polo  |red  |  2|

| 6|dress |blue |  2|

| 7|t-shirt|white |  2|

+—-+———+——–+——-+

SELECT s.* FROM personp,shirts

WHERE p.name LIKE ‘Lilliana%’

AND s.owner=p.id

AND s.color<>’white’;

+—-+——-+——–+——-+

|id|style|color |owner|

+—-+——-+——–+——-+

| 4|dress|orange|  2|

| 5|polo |red  |  2|

| 6|dress|blue |  2|

+—-+——-+——–+——-+

按照这种方式使用,REFERENCES子句不会显示在SHOWCREATETABLE或DESCRIBE的

输出中:
SHOW CREATE TABLE shirt\G

***************************1.row***************************

Table:shirt

Create Table:CREATE TABLE `shirt`(

`id` smallint(5) unsigned NOT NULL auto_increment,

`style `enum(‘t-shirt’,’polo’,’dress’) NOT NULL,

`color `enum(‘red’,’blue’,’orange’,’white’,’black’) NOT NULL,

`owner `smallint(5)unsigned NOT NULL,

PRIMARYKEY (`id`)

)ENGINE=MyISAMDEFAULTCHARSET=latin1;

在列定义中,按这种方式使用REFERENCES作为注释或“提示”适用于表MyISAM和BerkeleyDB。

Leave a Reply