暂无 |

1 建立表格

在建立好资料库以后,就可以根据储存资料的需求,使用SQL叙述建立所有需要的表格(table)。建立表格的设定非常多,以建立「world.city」表格来说,它的叙述会像这样:

mysql_09_snap_01

根据不同的需求,建立表格的语法有好几种,下列是建立表格基本的语法:

mysql_09_snap_02

MySQL规定一个表格中至少要有一个栏位,在设定表格中的栏位时,至少要明确的决定栏位的名称与型态,其它的栏位设定都是选择性的,如果有一个以上栏位,要使用逗号隔开:

mysql_09_snap_03

使用需要的资料型态,就可以建立一个可以储存亲友通讯录的表格:

mysql_09_snap_04

建立表格的时候可以使用「IF NOT EXISTS」选项,预防发生表格已存在的错误:

mysql_09_snap_05

1.1 表格属性

建立表格的时候也可以为表格加入需要的表格属性(table attributes)设定,这里会先讨论关于储存引擎、字元集和collat​​ion的属性设定。如果你在建立表格的时侯,没有指定这些属性,MySQL会使用伺服器预设的储存引擎作为表格的储存引擎,字元集与collat​​ion会使用资料库预设的设定。

你可以针对表格的需求,设定它使用的储存引擎、字元集与collat​​ion:

mysql_09_snap_06

下列的叙述在建立「addressbook」表格的时候,使用「ENGINE」、「CHARCTER SET」和「COLLATE」设定表格自己使用的储存引擎、字元集与collat​​ion:

mysql_09_snap_07

注:根据语法的说明,「CHARCTER SET」也可以使用比较简短的「CHARSET」;另外在设定时都可以省略「=」。

MySQL资料库伺服器支援许多不同应用的储存引擎,你可以使用「SHOW ENGINES」查询:

mysql_09_snap_08

在建立表格的时候,如果没有使用「ENGINE」设定储存引擎,那就会使用MySQL资料库伺服器预设的储存引擎。你可以使用下列的方式修改MySQL资料库伺服器预设的储存引擎设定:

  • 修改设定档:MySQL资料库伺服器在启动时会读取一个名称为「my.ini」的设定档,档案中有许多启动资料库伺服器时需要的资讯。其中就包含预设的储存引擎设定,你可以修改这个设定后再重新启动资料库伺服器,让新的设定生效:

mysql_09_snap_09

  • 设定储存引擎:你也可以使用「SET」叙述设定预设的储存引擎:

mysql_09_snap_10

在建立表格时指定字元集与collat​​ion会有一些不同的组合。如果只有指定字元集,MySQL会使用你指定字元集的预设collat​​ion:

mysql_09_snap_11

如果只有使用「COLLATE」指定collat​​ion,MySQL会使用你指定collat​​ion所属的字元集:

mysql_09_snap_12

注:建立表格的时候,不管你有没有指定,表格都会有字元集与collat​​ion的设定。在这个表格中的「非二进位制、non-binary」字串型态栏位,还有「ENUM」与「SET」型态栏位,都会使用表格预设的字元集与collat​​ion。

1.2 字串栏位属性

如果一个栏位的型态是字串的话,你还可以依照需求加入字串型态的栏位属性(column attributes)。「非二进位制、non-binary」字串可以额外设定字元集与collat​​ion:

mysql_09_snap_13

每一个表格都会有一个预设的字元集与collat​​ion设定,如果没有指定栏位的字元集与collat​​ion,就会使用预设的设定:

mysql_09_snap_14

1.3 数值栏位属性

数值型态栏位专用的属性设定有「UNSIGNED」、「ZEROFILL」与「AUTO_INCREMENT」:

mysql_09_snap_15

注:数值型态栏位设定为「UNSIGNED」与「ZEROFILL」的效果在「第八章、表格与索引、建立表格、数值栏位属性」中已经讨论过;而「AUTO_INCREMENT」的设定与索引有关,所以在这一章后面索引的部份一起讨论。

1.4 通用栏位属性

除了字串与数值两种栏位专用的栏位属性设定外,还有许多可以用在所有型态的栏位属性:

mysql_09_snap_16

「NOT NULL」栏位属性可以用来禁止某个栏位储存「NULL」值,一般来说,「NULL」值用来表示一个栏位的资料是「不确定」、「未知」或「没有」 。不过有一些栏位并不能出现「NULL」值,不然就会成为一笔很奇怪的纪录了:

mysql_09_snap_17

使用「NULL」或「NOT NULL」设定栏位属性后,在查询表格栏位资讯时,是在「Null」栏位用「YES」或「NO」来表示:

mysql_09_snap_18

如果一个表格中,有设定为「NOT NULL」的栏位,那就要注意你在新增或修改纪录时指定的资料,不能够违反这些规则:

mysql_09_snap_19

使用「DEFAULT」关键字可以设定栏位的预设值,你可以自己指定任何想要的预设值,在新增或修改资料的时候都有可能会使用到栏位的预设值。要特别注意的是MySQL限制你的预设值只能是「一个明确的值」,也就是预设值的设定不可以使用任何函式或运算式。

如果你没有为栏位使用「DEFAULT」关键字设定预设值,而且也没有设定为「NOT NULL」,MySQL会自动为你加入预设值的设定:

mysql_09_snap_20

以通讯录表格来说,如果纪录的地址大部份都是「Taipei」的话,你可以为「address」栏位设定一个预设值:

mysql_09_snap_22

使用「DEFAULT」关键字加入预设值的设定以后,就可以在新增或修改资料的时候使用:

预设值的设定要注意下列的规则:

  • 「BLOB」与「TEXT」栏位型态不可以使用[DEFAULT]关键字指定预设值,其它的栏位型态都可以
  • 不能与其它的栏位设定造成冲突。例如一个设定为「NOT NULL」的栏位,却使用「DEFAULT NULL」设定预设值为「NULL」
  • 指定的预设值要符合栏位型态。例如「DATE」型态栏位使用「DEFAULT 'Hello!'」指定预设值

注:「UNIQUE KEY」与「PRIMARY KEY」在这一章后面索引的部份一起讨论。

1.5 TIMESTAMP栏位型态与预设值

「TIMESTAMP」栏位是日期时间资料的一种,它除了具有「时区、timezone」的特性外,也可以搭配「DEFAULT」和「ON UPDATE」来完成一些比较特殊的需求:

mysql_09_snap_23

在表格中使用「TIMESTAMP」型态的栏位时,如果你没有设定它们的栏位属性,MySQL会自动帮你在第一个「TIMESTAMP」栏位加入「NOT NULL」、「DEFAULT」和「ON UPDATE」三个栏位属性的设定。

  • 「NOT NULL」不允许你储存「NULL」值
  • 「DEFAULT CURRENT_TIMESTAMP」设定预设值为目前的日期时间。在所有栏位型态中,只有「TIMESTAMP」可以使用「CURRENT_TIMESTAMP」指定预设值;其它的栏位型态,在指定预设值只能是「一个明确的值」
  • 「ON UPDATE」可以指定在修改纪录的时候,MySQL自动帮你填入的资料

其它没有设定栏位属性的「TIMESTAMP」栏位,MySQL会帮你加入「NOT NULL」与「DEFAULT」两个栏位属性。

「DEFAULT CURRENT_TIMESTAMP」栏位属性的效果,在你新增纪录的时候就可以看得出来了:

mysql_09_snap_24

而「ON UPDATE CURRENT_TIMESTAMP」栏位属性,会在修改纪录的时候产生效果:

mysql_09_snap_25

「TIMESTAMP」栏位型态很适合用来记录资料新增或修改的日期与时间。可是如果在同一笔纪录中,要使用一个栏位记录新增资料的日期与时间,而使用另一个栏位记录修改资料的日期与时间。为了应付这样的需求,你应该会使用下列的栏位定义:

mysql_09_snap_26

在一个表格中,MySQL限制「CURRENT_TIMESTAMP」只能在一个栏位出现,所以当有这样的需求出现时,你必须使用MySQL提供给你的特殊设定方式来解决:

mysql_09_snap_27

建立好这样的表格以后,看起来虽然怪怪的,不过当你指定「created」栏位的值为「NULL」的时候,MySQL会自动为你填入目前的日期与时间:

mysql_09_snap_28

后续在修改资料的时候,就只会在「updated」栏位填入目前的日期与时间:

mysql_09_snap_29

1.6 使用其它表格建立一个新表格

在资料库中建立需要的表格,通常是使用上列讨论的方式,根据自己的需求,建立一个新的表格来储存需要保存的资料;在一些比较特别的情况,你可能会使用一个现有的表格来建立新的表格,这样的需求可以使用下列的语法:

mysql_09_snap_30

以「world」资料库中的「city」来说,下列的查询叙述可以传回台湾的城市与人口数:

mysql_09_snap_31

如果你想要建立一个新表格,这个表格中的资料就是上列查询的结果,就可以使用这种建立表格的语法:

mysql_09_snap_32

使用这种语法建立的新表格,可以省略栏位定义的工作,新表格会使用原有表格的栏位名称与定义,而且在查询叙述中传回的资料,会直接新增到新建立的表格中:

mysql_09_snap_33

你也可以在建立新表格的时候,使用栏位定义来设定新表格的栏位型态与其它属性:

mysql_09_snap_34

如果需要的话,也可以加入查询叙述中没有的栏位:

mysql_09_snap_35

使用这种语法建立表格时有下列几个重点:

  • MySQL使用查询结果的栏位名称与型态来建立新的表格
  • 如果没有指定储存引擎、字元集或collat​​ion的话,建立的新表格使用资料库预设的储存引擎、字元集与collat​​ion
  • 查询表格中,栏位的索引与「AUTO_INCREMENT」设定都会被忽略

如果只需要借用一个已经存在的表格栏位定义,可是并不需要纪录资料的话,你可以使用下列的语法来建立新表格:

mysql_09_snap_36

使用这种语法建立的新表格,并不会新增纪录到新表格中,可是包含索引与「AUTO_INCREMENT」设定都会套用在新表格,除了下列两个例外:

  • 使用「MyISAM」储存引擎时,你可以在建立表格的时候使用「DATA DIRECTORY」与「INDEX DIRECTORY」指定资料与索引档案的资料夹位置;建立的新表格会忽略这些设定,而使用资料库预设的资料夹
  • 栏位的「FOREIGN KEY」与表格的「REFERENCES」属性设定都会被忽略

1.7 建立暂存表格

上列讨论的建立表格方式,都可以在建立表格的时候,依照需要加入「TEMPORARY」关键字,指定这个新建立的表格为「用户端暂时存在」的表格:

mysql_09_snap_37

「TEMPORARY」表格有下列重点:

  • 「TEMPORARY」表格是每一个用户端专属的表格,用户端离线后,MySQL就会自动删除这些表格
  • 因为「TEMPORARY」表格是用户端专属的表格,其它用户端不能使用,所以不同的用户端,使用同样名称建立「TEMPORARY」表格也没有关系
  • 「TEMPORARY」表格名称可以跟资料库中的表格名称一样,不过在「TEMPORARY」表格存在的时候,资料库中的表格会被隐藏起来
  • 可以使用「ALTER TABLE」修改「TEMPORARY」表格名称,不可以使用「RENAME TABLE」修改「TEMPORARY」表格名称

0

java教程
php教程
php+mysql教程
ThinkPHP教程
MySQL
C语言
css
javascript
Django教程

发表评论

    评价:
    验证码: 点击我更换图片
    最新评论